1、冒泡排序简介
冒泡排序是一种比较简单的排序算法,相信对于大家并不陌生,它通过不断访问相邻的元素列,比较两个相邻元素,如果顺序错误,就将两个元素换位置,这样的访问直到没有需要交换位置的元素为止,便完成整个排序,这个过程就像🐟吐泡泡一样,名字因此由来。
( 图一:效果演示 )
2、冒泡排序原理
(图二:原理显示)
如图所示,1、4、3、2、5这五个无序的数字,经历了四轮排序,变得从小到大有序了。第一轮排序,将第一个数字1和第二个数字3进行比较,我们发现1比4要小,所以我们不用交换位置,接着向后移动一下,这个时候,变成4和后面的3比较,此时4要比3大,所以交换两个数字的位置,这个时候4变成后面一位,所以这个时候4再和下一位2进行比较,此时4依然大,再换位置,最后4和后一位5比较,发现4是小的,所以不用换位置。这个时候进行完了第一轮比较,我们将最大的5拍到了最后面。紧接着依照此原理,进行下一轮比较,每次将剩下的数字中最大的移动到最后面,这样4轮下来,这五个数字就被排好了。
3、时间复杂度
比较轮数:C 移动次数:n 移动轮数:M
- 最好的情况:被排序文档最初是有序的,所以只需要扫描一边就可以,这个时候的C和M均达到最小值(C=n-1,M=0),其时间复杂度为O(n)。
- 最坏的情况:被排序文档最初是反序的,则需要进行n-1趟排序,在每一趟的排序中,又要进行n-i轮关键字的比较(1≤i≤n-1),并且没一轮比较都要交换位置,在这种情况下的话,移动轮数,和比较轮数均达到最大值( C=[n(n-1)]/2,M=[3n(n-1)]/2 )。此时的时间复杂度为O(n²)。
- 综上,冒泡排序的平均时间复杂度为O(n²)。
4、代码(未设置哨兵)
5、代码(设置哨兵)
如果到中间一轮轮,发现数组已经是有序的,这个时候后面的每一轮就只有比较操作而没有交换操作了,这是因为前面每一轮操作,不仅会使最大元素放在最后面,还会使较大元素向后移动,所以很多时候冒泡排序提前几轮就能达到有序(完全逆序除外),设置flag的便能在其有序后提前退出。
6、例题讲解
(图三:力扣官网题目颜色分类)
7、解题代码
8、题目讲解
将红、白、蓝用0,1,2代替后,这个问题便简化成了简单的排序问题,我们解决方法很多,在这里我们作用冒泡排序来解决,通过排序后,0,1,2被分开,这个时候便把颜色分类好了。