定义
冒泡排序(英语:Bubble Sort)又称为泡式排序,是一种简单的稳定排序算法
算法原理
它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。
走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
排序过程
算法描述
- 比较相邻的元素,如果第一个比第二个大,则交换
- 对每一对相邻的元素作此操作,从第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数
- 针对所有的元素重复以上步骤,除了最后一个
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
伪代码
function bubbleSort(array, length) {var i, j;for (i from 0 to length - 1) {for (j from 0 to length - 1 - i{if (arr[j] > arr[j + 1]{swap(arr[j], arr[j + 1])}}}}
函数 冒泡排序 输入 一个数组名称为array 其长度为lengthi 从 0 到 (length - 1)j 从 0 到 (length - 1 - i)如果 array[j] > array[j + 1]交换 array[j] 和 array[j + 1] 的值如果结束j循环结束i循环结束函数结束
助记码
i∈[0,N-1) //循环N-1遍j∈[0,N-1-i) //每遍循环要处理的无序部分swap(j,j+1) //两两排序(升序/降序)
复杂度
| 平均时间复杂度 | O(n^2) | | —- | —- | | 最坏时间复杂度 | O(n^2) | | 最优时间复杂度 | O(n) | | 空间复杂度 | 总共O(n),需要辅助空间O(1) | | 最佳解 | No | | 排序方式 | in-place | | 稳定性 | 稳定 |
Java代码
// 基础版本public void bubbleSort(List<Integer> list) {int length = list.size();for (int i = 0; i < length - 1; i++) {for (int j = 0; j < length - 1 - i; j++) {if (list.get(j) > list.get(j + 1)) {swap(list, j, j+1);}}}}// 改进版本public void bubbleSortV2(List<Integer> list) {int length = list.size();for (int i = 0; i < length - 1; i++) {// 是否发生交换。没有交换,提前跳出外层循环boolean flag = false;for (int j = 0; j < length - 1 - i; j++) {if (list.get(j) > list.get(j + 1)) {swap(list, j, j+1);flag = true;}}if (!flag) {break;}}}void swap(List<Integer> list,Integer a,Integer b) {int temp = list.get(a);list.set(a, list.get(b));list.set(b, temp);}
