冒泡排序是一种基本的排序算法。参加的校招的时候笔试就有让写出冒泡排序程序的,毕业找工作面试过程中也有让写冒泡程序的。大学C语言程序设计这门课中学的冒泡排序,不过不管哪种语言,排序算法与思路是相同的。
1.时间复杂度
冒泡排序算法的时间复杂度高,平均时间复杂度:O(N^2)。
2.基本思想
两个数比较大小,较大的数下沉,较小的数冒起来。
3.基本流程
每一轮从头开始两两比较,比较相邻的两个数据,如果第二个数小,就交换位置,将较大的项放在较小项的右边。这样每轮下来保证该轮最大的数在最右边。
如下图:
第一趟排序将最大的数字筛选出,放在最右侧。
4.JavaScript实现冒泡排序
将数组[88,34,41,23,27,91]中元素从小到大排序。
实现代码如下:
运行上述程序,结果为:
上面可以正确的实现从小到大排序,也可以得出:
如果有n个数,内循环次数为(n-1)^2,外循环的次数为n-1。
但是上面的程序还存在问题,例如,
(1)上面数组有6个数,第一趟比较5次,第二趟只需要比较4次,依次减少,上面程序每次都是比较5次。
(2)如果某一趟排序之后数组已经有序,后面就不要再比较,这时需要减少排序的趟数,否则会做很多无用功。
-
针对问题1优化
优化方法:
数据两两比较的次数减去外层循环变量i。代码如下:
运行结果为:
这次内层循环次数减少,减小到15次。比第一次效率提高。 -
针对问题2优化
优化方法:
设置布尔值作为状态变量,判断排序是否完成,如果完成,不再进行下面的循环,否则,继续循环进行排序。
优化代码如下:
运行结果为:
此次内循环和外循环次数都有减少,因此程序的运行效率较上次又有提高。
这样优化就完成了,代码逻辑比较简单,通过一个布尔变量即可监控一趟过程有没有进行数据交换。冒泡排序最好的情况是初始状态是正序的,一次扫描就可以完成排序,所以最好的时间复杂度为O(N),最坏的情况是反序的,此时最坏的时间复杂度为O(N^2), 平均情况,每轮N/2次循环,N轮时间复杂度为O(N^2)。
每天进步一点点,开心一点点,快乐一点点!come on Girl!