冒泡排序
冒泡排序
一、算法描述
1.1 核心思想
- 每次操作只会影响相邻的 2 个元素
- 每轮冒泡至少让 1 个元素移动到它正确的位置(1 轮是指从头到尾操作一遍元素)
- 最多经过 n 轮冒泡后,所有元素都会被移到正确的位置
1.2 细节解释
比如说,数组 [2, 7, 1, 4, 3, 6, 5]
。
1 | ___ ___ ___ ___ ___ ___ ___ |
从后面往前面冒泡,由于 5 < 6
所以 5 要往前冒泡:
1 | ___ |
接着判断 5 > 3
,5 不能往前冒泡,当前对象换成 3:
1 | | |
接下来是 3 < 4
,所以 3 要往前冒泡:
1 | ___ |
再接着是 3 > 1
,3 不能冒泡,切换当前对象为 1:
1 | | |
接下来是 1 < 7
,1 要往前冒泡:
1 | ___ |
最后是 1 < 2
,所以 1 要往前冒泡:
1 | ___ |
这样一轮冒泡结束后,1 已经在它应该在的位置了。
1 | 已排序 未排序 |
后面再对其他未排序的元素进行冒泡,直到所有元素都排好序为止。
每过一轮冒泡,总能把一个值放到它正确的位置,经过 n 轮后就排好序了。
二、算法实现
- 总共执行 n 轮冒泡
- 每轮冒泡,会将未排序元素的最小值放到已排序元素的后面
1 | public void bubbleSort(int[] arr) { |
举个例子,原始数据是:[0, 3, 1, 6, 2, 5, 4]
,冒泡排序过程如下:
1 | =====第 1 轮冒泡===== |
三、算法优化
当某轮冒泡中,没有执行任何交换时,其实就说明数组已经排序好了。
遇到这种情况,可以对冒泡排序进行优化,提前跳出循环:
1 | public void bubbleSort(int[] arr) { |
上面同样的例子,执行过程如下:
1 | =====第 1 轮冒泡===== |
四、算法分析
4.1 时间复杂度
- 最好时间复杂度:O(n)
- 最坏时间复杂度:O(n^2)
- 平均时间复杂度:O(n^2)
4.2 空间复杂度
- 空间复杂度:O(1)
- 原地算法
4.3 稳定性
- 稳定排序算法
附录
1 | /** |