冒泡排序(Bubble Sort)
- 平均时间复杂度:O(n)
- 最好情况:O(n) ——遍历一次发现没有任何可以交换的元素,排序结束
- 最坏情况:O(n)——反序列情况下最坏
- 空间复杂度:O(1)
- 排序方式:内部
- 稳定性:稳定
C++代码实现
void bubbleSort(vector<int>& arr) {int len = arr.size();//(优化②)记录最后一次交换的位置int lastExchangeIndex = 0;int sortBorder = len-1;for(int i = 0; i < len; i++) {//(优化①)有序标记,每一轮的初始是truebool isSorted = true;for(int j = 0 ; j < sortBorder; j++) {if(arr[j] > arr[j+1]){ //cmpswap(arr[i],arr[j]);//(优化①)有元素交换,所以不是有序,标记变为falseisSorted = false;//(优化②)把无序数列的边界更新为最后一次交换元素的位置lastExchangeIndex = j;}}//(优化①) 没有交换操作,排序结束if(isSorted) break;//(优化②)从0~最后一次交换位置排序sortBorder = lastExchangeIndex;}}
1. 算法步骤
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较;
优化步骤
① 如果某次内循环中没有交换操作,说明序列已经有序,结束排序;
② 当序列后部分有序时,只需记下最后交换的下标位置,后面已经有序;
③ 鸡尾酒算法优化(本篇未实现)
2. 动图演示(无优化)

