你所不知道的冒泡排序

说到排序,耳熟能详,手写代码都可以很顺溜的冒泡排序。但是追究冒泡排序的优化的时候,那么估计就有很多人懵逼了。下面介绍几种冒泡的几个优化点吧。

有这么一个数列:
int[] number1 = {1, 6, 0, 2, 4, 3, 9, 7, 8};

常规的写法:
常规冒泡

这种冒泡写法,一直要到每一轮的每一次对比完成后,循环才会结束,显然这样的写法效率比较低,而且某些时候数列有一部分是有序的,也要去轮训对比,这个就没必要了,针对这两点下面进行优化:

优化1:
定义一个标记,某一轮比较只要没有交换的元素了那么后面的对比就没必要了直接break
优化1

这样定一个boolea类型的标记,每一轮只要有数据进行交换就说明后面还有对比的需要,标记为false。某一轮,没有发生数据交换了,说明后面的数列是有序数列了,就没有比较的需要了,直接中断循环,这样可以减少不必要的循环,从而提高排序的效率。在优化1的基础上,其实还可以优化。

优化2:
数列经过排列分为有序和无序部分,那么有序部分就不需要比较,每一轮排序最后一次元素交换的位置就是无序数列的边界,后面就是有序的了
优化2
记录下每一轮的最后一次数据交换的位置,那么下一轮进行比较的时候,该位置后面的元素就没必要去比较了,因为每一轮都会吧最大的数放在最后,那么最后一次交换后,后面的数都比前面的大,且有序。

根据打印的count变量也可以明显看出循环的次数优化后是明显减少的。其实对于优化还有一种,就是所谓的鸡尾酒排序(不知道怎么区这个名字)。

对于鸡尾酒排序,更多的是针对于大部分元素已经有序的情况下,效率会更高。不然其他情况优化2方案效率是比较不错的。

鸡尾酒排序

其实是基于优化2,对于每轮大循环中有两个小循环,定义左右边界,其中一个小循环从左边界开始到右边界开始对比,另外一个循环从右边界往左边界开始对比。这种排序如果大部分数列是有序的,效率还是比较高的,但是无序的比较多,优化2方案效率还是会高一点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值