你所不知道的冒泡排序
Posted xiaohuanqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你所不知道的冒泡排序相关的知识,希望对你有一定的参考价值。
说到排序,耳熟能详,手写代码都可以很顺溜的冒泡排序。但是追究冒泡排序的优化的时候,那么估计就有很多人懵逼了。下面介绍几种冒泡的几个优化点吧。
有这么一个数列:
int[] number1 = 1, 6, 0, 2, 4, 3, 9, 7, 8;
常规的写法:
这种冒泡写法,一直要到每一轮的每一次对比完成后,循环才会结束,显然这样的写法效率比较低,而且某些时候数列有一部分是有序的,也要去轮训对比,这个就没必要了,针对这两点下面进行优化:
优化1:
定义一个标记,某一轮比较只要没有交换的元素了那么后面的对比就没必要了直接break
这样定一个boolea类型的标记,每一轮只要有数据进行交换就说明后面还有对比的需要,标记为false。某一轮,没有发生数据交换了,说明后面的数列是有序数列了,就没有比较的需要了,直接中断循环,这样可以减少不必要的循环,从而提高排序的效率。在优化1的基础上,其实还可以优化。
优化2:
数列经过排列分为有序和无序部分,那么有序部分就不需要比较,每一轮排序最后一次元素交换的位置就是无序数列的边界,后面就是有序的了
记录下每一轮的最后一次数据交换的位置,那么下一轮进行比较的时候,该位置后面的元素就没必要去比较了,因为每一轮都会吧最大的数放在最后,那么最后一次交换后,后面的数都比前面的大,且有序。
根据打印的count变量也可以明显看出循环的次数优化后是明显减少的。其实对于优化还有一种,就是所谓的鸡尾酒排序(不知道怎么区这个名字)。
对于鸡尾酒排序,更多的是针对于大部分元素已经有序的情况下,效率会更高。不然其他情况优化2方案效率是比较不错的。
其实是基于优化2,对于每轮大循环中有两个小循环,定义左右边界,其中一个小循环从左边界开始到右边界开始对比,另外一个循环从右边界往左边界开始对比。这种排序如果大部分数列是有序的,效率还是比较高的,但是无序的比较多,优化2方案效率还是会高一点。
以上是关于你所不知道的冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章