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

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

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


冒泡排序算法优化--双向冒泡_第1张图片
一般冒泡排序

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

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


冒泡排序算法优化--双向冒泡_第2张图片
加了交换标志位的

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

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


冒泡排序算法优化--双向冒泡_第3张图片
双向排序

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


冒泡排序算法优化--双向冒泡_第4张图片
最终算法

你可能感兴趣的:(冒泡排序算法优化--双向冒泡)