冒泡排序算法优化--双向冒泡

冒泡排序算法的核心是:大数下沉,小数上冒。每一次总能找到一个最大的或者最小的。

先看下一般冒泡排序算法的实现:


一般冒泡排序

这里需要注意的两轮循环的次数。在第一轮循环的时候,次数为数组长度减1。第二轮循环的次数为剩余需要排序数量。这个是这个算法的精华

这里引入了第一个问题:如果数字正好是跟排序规则相反的,那么确实需要执行length - 1次,比如说,原始数据是1,2,3,4,5。我现在需要做从大到小排序,那么确实需要执行四次。但是如果数据是2,1,5,4,3。外层循环只需要执行两次,结果就已经正确的,后续的其实根本不需要执行了。为了解决这个问题,修改下排序方法,加个标志位,如果第i轮已经不执行交换操作了,那么说明排序结束了。修改下bubbleSort方法:


加了交换标志位的

再引入第二个问题:正如一开始说的,冒泡排序的核心是每一次执行总能找到一个最大的和最小的。回想一下插入排序,插入排序有个优化的算法,叫做双向插入排序,那么是否也能做个类似的,做个双向冒泡排序。每一次外层循环,不仅能找到一个最小的,同时也能找到一个最大的。

先通过数据做个简单的推理:2,1,5,4,3,如果做降序,那么第一次外循环的结果应该是2 5 4 3 1。找到了一个最小数1放在最后,那么就应该考虑对前四个进行一个增序操作,只不过这个增序是筛选一个最大的放到第一位。按照这个规则实现下逻辑:


双向排序

最后,把这两套优化合并:


最终算法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容