冒泡排序(Bubble Sort)
标签
稳定排序、原地排序、比较排序
基本思想
与插入排序不同,冒泡排序是一种基于交换的排序算法。基于交换的排序,是指根据线性表中两个元素关键字的比较结果来对换这两个元素在序列中的位置。
假如待排序线性表的长度为$n$,从前往后两两比较相邻元素的关键字,若$a_{i - 1} > a_i$,则交换它们,直到线性表比较完成。每趟交换以后最后一个元素一定是最大的,不再参与下一趟交换。也就是对于第$i$趟交换,只需要比较到$a_{n - i}$即可。直到一趟比较内没有进行交换,算法结束。
算法描述
- 步骤1: 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 步骤2: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 步骤3: 针对所有的元素重复以上的步骤,除了已比较完的最后一个;
- 步骤4: 重复步骤1~3,直到排序完成。
动图演示
时间复杂度
和插入排序一样,也为$O(n^2)$。
最好的情况:如果待排序数据序列为正序,则一趟冒泡就可完成排序,排序码的比较次数为$n - 1$次,且没有移动,时间复杂度为$O(n)$。
最坏的情况:如果待排序数据序列为逆序,则冒泡排序需要$n - 1$次趟起泡,每趟进行$n - i$次排序码的比较和移动,即比较和移动次数均达到最大值: 比较次数:$C_{max} = \sum_{i = 1}^{n − 1} (n − i) = n \frac{(n−1)}{2} = O(n^2)$ 。移动次数等于比较次数,因此最坏时间复杂度为$O(n^2)$。
平均情况:$O(n^2)$
空间复杂度
没有额外的空间开销。
算法示例
参考资料:
https://blog.csdn.net/coolwriter/article/details/78732728
https://blog.csdn.net/weixin_41190227/article/details/86600821
https://www.cnblogs.com/itsharehome/p/11058010.html
Min是清明的茗