世界上只有少数人能够最终达到自己的理想。———— 毛姆《月亮与六便士》

一、算法思想

冒泡排序,有时也称为下沉排序,是一种简单的排序算法,它重复遍历要排序的列表,比较每对相邻的元素,如果它们的顺序错误(升序或降序排列),则交换它们。 重复遍历列表直到不需要交换,这表明列表已排序。

二、工作流程

假设我们试图按升序对元素进行排序。

1. 第一次迭代(比较和交换)

  1. 从第一个索引开始,比较第一个和第二个元素。
  2. 如果第一个元素大于第二个元素,则交换它们。
  3. 现在,比较第二个和第三个元素。如果它们不满足条件则交换它们。
  4. 上述过程一直持续到最后一个元素。

2. 剩余迭代

对剩余的迭代进行相同的过程,每次迭代后,将未排序元素中最大的元素放在最后。

在每次迭代中,比较进行到最后一个未排序的元素。

当所有未排序的元素都放在正确的位置时,数组就被排序了。

三、冒泡排序代码实现

伪代码实现流程

bubbleSort(array)for i <- 1 to indexOfLastUnsortedElement-1if leftElement > rightElementswap leftElement and rightElement
end bubbleSort

Java 实现冒泡排序

/*** 冒泡排序** @className: BubbleSort* @date: 2021/6/22 14:19*/
public class BubbleSort {public static void main(String[] args) {int[] arr = {-2, 45, 0, 11, -9};bubbleSort(arr);System.out.println(Arrays.toString(arr));}/*** 冒泡排序* 算法思想:比较相邻两个元素,如果第一个元素比第二个大,则交换位置** @param arr*/public static void bubbleSort(int[] arr) {int length = arr.length;// 循环的轮数为:length - 1for (int i = 0; i < length - 1; i++) {// 每一轮需要比较的次数:length - i - 1for (int j = 0; j < length - i - 1; j++) {// 比较相邻两个元素,如果第一个元素比第二个大,则交换位置if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}
}

优化冒泡排序算法

在上述算法中,即使数组已经排序,也会进行所有比较,这会增加执行时间。

为了解决这个问题,我们可以引入一个额外的变量 flag 默认值为 false,如果发生元素交换,则设置为 true;否则,它被设置为 false

迭代后,如果没有交换,则值 flagfalse,这意味着元素已经排序,不需要执行进一步的迭代,这将减少执行时间并有助于优化冒泡排序。

bubbleSort(array)flag <- falsefor i <- 1 to indexOfLastUnsortedElement-1if leftElement > rightElementswap leftElement and rightElementflag <- true
end bubbleSort

优化冒泡排序实现

import java.util.Arrays;/*** 冒泡排序优化** @className: BubbleSort* @date: 2021/6/22 14:19*/
public class BubbleSort {public static void main(String[] args) {int[] arr = {-2, 45, 0, 11, -9};bubbleSort(arr);System.out.println(Arrays.toString(arr));}/*** 冒泡排序* 算法思想:比较相邻两个元素,如果第一个元素比第二个大,则交换位置** @param arr*/public static void bubbleSort(int[] arr) {int length = arr.length;// 循环的轮数为:length - 1for (int i = 0; i < length - 1; i++) {// 检查是否发生交换,默认为 falseboolean flag = false;// 每一轮需要比较的次数:length - i - 1for (int j = 0; j < length - i - 1; j++) {// 比较相邻两个元素,如果第一个元素比第二个大,则交换位置if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;// 发生交换修改标识flag = true;}}// 如果没有发生交换,则说明数组是有序的,直接结束后续循环比较if (!flag) {break;}}}
}

四、冒泡排序的复杂度

时间复杂度
最好 O(n)
最差 O(n2 )
平均 O(n2 )
空间复杂度 O(1)
稳定

1. 时间复杂度的计算细节

冒泡排序比较相邻元素。

循环 比较次数
第一 (n - 1)
第二 (n - 2)
第三 (n - 3)
最后 1

因此,比较的次数是:(n-1) + (n-2) + (n-3) +.....+ 1 = n(n-1)/2 ,几乎等于 n2,因此复杂性:O(n2)。此外,如果我们观察代码,冒泡排序需要两个循环,因此复杂度为 n*n = n2

  • 最坏情况复杂度 O(n2): 如果我们想将一个有序数组倒序排列,那么最坏的情况就会发生。
  • 最佳案例复杂度 O(n):如果数组已经排序,则不需要排序。
  • 平均案例复杂度 O(n2): 当数组的元素处于混乱的顺序(既不升也不降)时,就会发生这种情况。

2. 空间复杂度

  • 空间复杂度是O(1)因为额外的变量用于交换。
  • 在优化的冒泡排序算法中,使用了两个额外的变量。因此,空间复杂度为O(2)。

五、冒泡排序应用

使用冒泡排序

  • 复杂性无关紧要
  • 排序的数据量较小

参考文章:

https://www.programiz.com/dsa/bubble-sort

【算法】冒泡排序图文讲解相关推荐

  1. 冒泡排序出现的问题_停课不停学 | 有趣的算法——冒泡排序

    停课不停学 有趣的算法--冒泡排序 01 生活中处处都有算法 每个人每天都会用到一些算法,算法也是人类使用计算机解决问题的技巧之一,但是算法并不是仅仅用于计算机领域中,包括在数学.物理甚至是每天的生活 ...

  2. 总结c语言基础算法——冒泡排序法和选择排序法

    1.首先无论何种排序方法其最终目的是按要求将所给数据进行排序.而在C语言中可以有很多排序的方法,这里着重介绍的是常用的较为基础和重要的算法--冒泡排序法和选择排序法. 下面将举一个例子进行讲解: 要求 ...

  3. C#冒泡排序原理讲解及代码块

    C#冒泡排序原理讲解及代码块 一.冒泡排序理论 (1)基本概念由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序.冒泡排序的时间复杂度为O(n*n). (2)逻辑分析依次比 ...

  4. 新概念一册电子书课本_新概念英语第二册完整版:音频+动画视频+课本图文讲解...

    新概念英语 <新概念英语>是一经典得已经无需多做解释的英语学习好教材.它采用和人们生活.学习密切相关的语言材料,遵循语言习得的科学性及渐进性,可全面提升学生的听.说.读.写能力,使语言能力 ...

  5. C语言基础排序算法-冒泡排序

    C语言基础排序算法-冒泡排序 什么是冒泡排序? 顾名思义,这种排序方法就像水中的气泡一样,从底逐渐往上冒,一次前进一步.我们来看一个例子,看看到底是怎么冒泡的.假设有一个数组3,2,5,4,1,我们希 ...

  6. pppoe 服务器 无线,无线路由器怎么设置PPPOE拨号【图文讲解】

    1.如果是电话线到家,首先把路由器的WAN口和Modem的LAN口连接起来,电脑网卡连接路由器任意一个LAN口;如果是网线到家,就直接把网线接到路由器WAN口. 然后为电脑设置网络参数,指定IP地址, ...

  7. python分割数字_对python数据切割归并算法的实例讲解

    当一个 .txt 文件的数据过于庞大,此时想要对数据进行排序就需要先将数据进行切割,然后通过归并排序,最终实现对整体数据的排序.要实现这个过程我们需要进行以下几步:获取总数据行数:根据行数按照自己的需 ...

  8. 经典排序算法 - 冒泡排序Bubble sort

    经典排序算法 - 冒泡排序Bubble sort 其原理是比较接近的数字22,按照从小到交换大或降序排列, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头開始进行两两比較交换,直到倒 ...

  9. 优化算法求解复杂约束问题策略(以粒子群算法为例讲解求解复杂约束问题的多种策略)

    优化算法求解复杂约束问题策略(以粒子群算法为例讲解求解复杂约束问题的多种策略)python实现     整个代码文字讲解共17页 提示:专栏解锁后,可以查看该专栏所有文章. 文章目录 策略1:在位置更 ...

  10. JS数据结构与算法——冒泡排序(把大的数字依次往后放)

    一.图解排序过程 注意:比较次数和交换次数之所以不一致,是因为:比较了并不一定就需要交换两个数字的位置,比如比较 1 和 2两个数字,由于 后者本身就比前者大,所以不需要交换两者的位置. 二.代码实现 ...

最新文章

  1. System commands can run from cmd
  2. 图片滤镜算法原理简单讲解
  3. python下载网络错误_下载失败,出现“网络错误”+40000
  4. RSA加解密算法的Java实现
  5. 我们生活在最好的时代
  6. 好产品要满足人性七宗罪
  7. 一维树桩数组区间更新、区间查询
  8. STM32 USART 波特率计算
  9. SpringMVC中@RequestMapping参数设置
  10. openlayer4 加载arcgis rest 服务
  11. Neo4j下载安装及使用
  12. 津巴布韦 apn_津巴布韦的回忆-你负担不起回家
  13. 高数_第6章无穷级数__幂级数_收敛点收敛域收敛半径
  14. 计算机表格外边框颜色怎么设置,#表格外部框线设置颜色#如何把excel里所有边框颜色改变...
  15. 为什么保持代码整洁如此重要?
  16. ZZULIOJ-1035,分段函数求值(Python)
  17. BUUCTF·[MRCTF2020]天干地支+甲子·WP
  18. 君子不和牛置气,混蛋让它混到底-- 骂 老板 6
  19. 不完全性定理 元数学和自然数_开读哥德尔原著第一章——哥德尔读后之十
  20. <artifactId>spring-boot-maven-plugin</artifactId> 这一行在POM.xml文件中一直爆红,如何解决.问题记录日期:2020-09-05

热门文章

  1. 带中文说明书OSLO Light 6.2-ISO 1CD光学软件
  2. cad调了比例因子没反应_10个常见cad问题的解决方法!学会了这几招不再求人
  3. 蚁群算法原理c语言,蚁群算法原理及其应用--详细介绍
  4. python 合并两个txt文件
  5. Oracle执行计划使用分析SQL执行效率
  6. 北海焊接机器人_北海中型机械手臂生产,机械手
  7. 良心安利动物 恐龙unity3d模型素材网站
  8. 怎样才能从Java初级程序员成长为一名合格的架构师?
  9. 锐浪报表 Grid++Report PrintPreview 显示模式
  10. 2022-2027年中国智能化设计行业发展前景及投资战略咨询报告