排序-冒泡排序(bubble sort)

冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,就如同水底的气泡一样逐渐向上冒。

冒泡排序的特点包括:

  1. 时间复杂度

    • 最好情况(输入数组已经是排序好的):O(n),因为此时只需遍历一次数组即可发现没有交换发生,说明数组已经是有序的。
    • 平均情况和最坏情况(数组完全逆序或随机排列):O(n^2),因为需要进行多次遍历来确保所有元素都达到其最终位置。
  2. 空间复杂度

    • O(1),冒泡排序也是原地排序算法,除了交换元素时使用的临时变量外,不需要额外的存储空间。
  3. 稳定性

    • 冒泡排序是稳定的排序算法。如果存在相等的元素,它们的相对顺序在排序前后不会改变。
  4. 算法步骤

    • 从数组的第一个元素开始,比较相邻的两个元素,如果前一个比后一个大,则交换它们的位置。
    • 对每一对相邻元素做同样的比较,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
    • 针对所有的元素重复以上的步骤,除了最后一个。
    • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

尽管冒泡排序实现简单,但由于其较低的效率,在处理大规模数据集时并不常用。在实践中,通常会采用更高效的排序算法,如快速排序、归并排序等。不过,冒泡排序在小规模数据或几乎已排序的数据集中仍然有其简单直接的应用价值。此外,通过添加标志位来检测在一次遍历中是否有发生交换,可以提前结束没有交换的循环,从而优化冒泡排序的最坏情况性能。

一下是冒泡排序的Java代码实现:

/* 冒泡排序 */
void bubbleSort(int[] nums) {// 外循环:未排序区间为 [0, i]for (int i = nums.length - 1; i > 0; i--) {// 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端for (int j = 0; j < i; j++) {if (nums[j] > nums[j + 1]) {// 交换 nums[j] 与 nums[j + 1]int tmp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = tmp;}}}
}

代码优化:如果某轮“冒泡”中没有执行任何交换操作,说明数组已经完成排序,可直接返回结果。因此,可以增加一个标志位 flag 来监测这种情况,一旦出现就立即返回。

/* 冒泡排序(标志优化) */
void bubbleSortWithFlag(int[] nums) {// 外循环:未排序区间为 [0, i]for (int i = nums.length - 1; i > 0; i--) {boolean flag = false; // 初始化标志位// 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端for (int j = 0; j < i; j++) {if (nums[j] > nums[j + 1]) {// 交换 nums[j] 与 nums[j + 1]int tmp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = tmp;flag = true; // 记录交换元素}}if (!flag)break; // 此轮“冒泡”未交换任何元素,直接跳出}
}

经过优化,冒泡排序的最差时间复杂度和平均时间复杂度仍为 𝑂(𝑛2) ;但当输入数组完全有序时,可达到最佳时间复杂度 𝑂(𝑛) 

一下是冒泡排序的实现图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/698166.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发题库

一. 单选题&#xff08;共12题&#xff0c;60分&#xff09; 1. (单选题) 有如下HTML代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Document</title> <style> ul,li{ margin:0; p…

基于springboot实现教师工作量管理系统项目【项目源码+论文说明】

基于springboot实现教师工作量管理系统演示 摘要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;教师信息因为其管理内容繁杂&#xff0c…

代理IP的使用对于保护个人隐私的影响研究

目录 一、前言 二、代理IP的定义和分类 三、代理IP的使用对个人隐私的保护影响 四、代理IP的实际应用举例 五、代理IP的局限性和改进建议 六、结论 一、前言 随着互联网的快速发展和普及&#xff0c;个人隐私保护问题日益严重。在互联网上&#xff0c;个人信息很容易被获…

安川直线电机Σ-X系列的性能与特点详解

为满足设备高精度、高速度等要求&#xff0c;安川电机公司推出了Σ-X系列直线电机&#xff0c;凭借其高速、高加减速、对应行程长、匀速、稳定性好、洁净、静音、免维护的特点&#xff0c;在精密制造领域中得到了广泛应用。 安川直线电机拥Σ-X系列有三种规格型号&#xff1a;S…

SCQA表达模型:让你的表达更具吸引力(2)

一、引言 站在巨人的肩膀上&#xff0c;思维模型是前人智慧结晶&#xff0c;当我们面对相似挑战时&#xff0c;借鉴与模仿这些模型&#xff0c;往往能为我们带来意想不到的结果。 在信息爆炸的时代&#xff0c;如何高效、准确地传达信息成为了人们关注的焦点。SCQA表达模型作为…

【微信小程序开发】深入探索事件绑定、事件冒泡、页面跳转的逻辑实现

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

银行监管报送系统系列介绍(十七):一表通2.0

国家金融监督管理总局于9月发布了【一表通2.0&#xff08;试用版&#xff09;】&#xff08;简称&#xff1a;一表通2.0&#xff09;&#xff0c;在原试点报送范围的基础上扩大了试点报送区域&#xff0c;意味着将陆续扩大试报送机构范围&#xff0c;推进的速度已明显加快。尽早…

案例分享 I 千视协助Lentia City 购物中心实现轻量化、数字化转型

随着文娱活动的日益复苏&#xff0c;Lentia City作为奥地利最受欢迎的社交和文化聚集地之一&#xff0c;正逐渐成为人们追逐乐趣和交流的热门去处。这里丰富多彩的音乐表演和活动吸引着大量人群&#xff0c;为城市注入了生机和活力。 这些活动不仅仅是简单的娱乐&#xff0c;它…

解决宝塔Nginx和phpMyAdmin配置端口冲突问题

问题描述 在对基于宝塔面板的 Nginx 配置文件进行端口修改时&#xff0c;我注意到 phpMyAdmin 的端口配置似乎也随之发生了变化&#xff01; 解决方法 官方建议在处理 Nginx 配置时&#xff0c;应避免直接修改默认的配置文件&#xff0c;以确保系统的稳定性和简化后续的维护…

python数据分析——时间序列

时间序列 前言一、Datetime 模块常用函数和数据结构的详细解释datetime模块示例一示例二 二、时间运算示例一示例二示例三 三、时间序列分析自回归(Autoregressive model/AR)模型示例 滑动平均(moving average model/MA)模型示例 自回归滑动平均(Autoregressive moving average…

如文所示:

影响 ConnectWise 的 ScreenConnect 远程桌面访问产品的严重漏洞已被广泛利用来传播勒索软件和其他类型的恶意软件。 ConnectWise 于 2 月 19 日通知客户&#xff0c;它已发布针对关键身份验证绕过缺陷和高严重性路径遍历问题的补丁。该安全漏洞当时没有 CVE 标识符。第二天&am…

Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)

1 漏洞概述 CVE-2018-2628 是 Oracle WebLogic Server&#xff08;WLS&#xff09;核心组件中的一个反序列化命令执行漏洞。此漏洞允许未授权的用户通过 T3 协议在远程服务器上执行任意命令&#xff0c;从而可能完全控制受影响的服务器。 2 影响版本 该漏洞影响了以下版本的…