冒泡排序 | 青训营笔记

232 阅读2分钟

原理介绍

冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。这样的称为一趟冒泡排序,每一趟排序的结果最后一个数就是最大的数。

在排序的过程中,每一趟冒泡都会将未排序的元素中最大的数冒泡到数列的最后。这样,该元素就会被排到它应该去的位置。

冒泡排序的时间复杂度为O(n^2),因此对于大规模的数据排序效率较低。

个人理解中,其实冒泡排序也可以叫“沉底排序”,因为每一轮冒泡之后,总会产生一个最大或者最小的数“沉底”到未排序部分的最后面。

这里推荐一个数据结构可视化的网站:Comparison Sorting Visualization (usfca.edu)

点击 Randomize Array 即可生成随机数组,点击 Bubble Sort 即可查看冒泡排序的动画。

image-20230604234557393.png

从上图也可以看出,第一轮排序结束之后,不管原数组的顺序如何,最大的数96总会沉在这次排序的最后面。而当前图上的轮次(第二轮)结束后,显然会产生一个新的沉底数94。

优化部分

提前结束优化

当某一轮比较均未发生交换,说明排序已完成,可设置一个布尔值记录一轮排序是否有发生交换,若无则提前退出循环结束程序。

冒泡界优化

记录前一轮交换的最终位置,该位置之后的元素为已排序状态,下一轮的交换只需执行到该处。提前结束优化可视为一个特殊的冒泡界。