冒泡排序算法实现及其优化

版权声明:转载请标明出处 https://blog.csdn.net/w1418899532/article/details/84679153

冒泡排序是一种基本的排序算法。参加的校招的时候笔试就有让写出冒泡排序程序的,毕业找工作面试过程中也有让写冒泡程序的。大学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。代码如下:
    优化1
    运行结果为:
    排序内层循环变少
    这次内层循环次数减少,减小到15次。比第一次效率提高。

  • 针对问题2优化
    优化方法:
    设置布尔值作为状态变量,判断排序是否完成,如果完成,不再进行下面的循环,否则,继续循环进行排序。
    优化代码如下:
    优化代码2
    运行结果为:
    优化2结果
    此次内循环和外循环次数都有减少,因此程序的运行效率较上次又有提高。
    这样优化就完成了,代码逻辑比较简单,通过一个布尔变量即可监控一趟过程有没有进行数据交换。

    冒泡排序最好的情况是初始状态是正序的,一次扫描就可以完成排序,所以最好的时间复杂度为O(N),最坏的情况是反序的,此时最坏的时间复杂度为O(N^2), 平均情况,每轮N/2次循环,N轮时间复杂度为O(N^2)。

每天进步一点点,开心一点点,快乐一点点!come on Girl!

猜你喜欢

转载自blog.csdn.net/w1418899532/article/details/84679153
今日推荐