网上流传的所谓冒泡排序加强版,真的加强了吗?

最近看到很多博客都有写到冒泡的改良版,大概的思路都是一样的,然而我本人持怀疑态度,决定亲自实验测试一下,当然,如果强加班能让冒泡大哥不再那么累的对比,那对计算机也是一件极好的事情。

看了一下大概的改良思路,大致都是从以下两点着手:

一、设置标志位FLAG,如果检测到一次冒泡后没有数据交换,那么必然有序,直接返回数据

这个东东思路还是很好的,在给定的数据已经有序的情况下,效率提升了NNN倍都不止,这样冒泡大哥就不用傻傻的再一一对比了。

二、设置对比的border位,用j的值更新,在border后的数据必然有序,就可以不做运算了

这个改良的思路我个人认为比较鸡肋,为什么呢?因为如果数据量稍微大一些,且在随机的情况下,指望后面的给定数据直接是有序的,这个概率极低,而且哪怕后面的99%的数据都有序了,只要有一个数据不满足条件,那么还是无法触发这个东西,反倒是每次都要更新界限值,做了大量赋值运算。

 

下面具体来看看代码测试:

在我自己做好的类中添加冒泡加强版,这样我们直接就可以用装饰器打印出运算时间。

 

先生成1000个随机数,范围是0到1000

 

七位选手的比赛成绩已经出来了。。。

果不其然,最惨的冒泡选手还是垫底,而它的改良版甚至还不如原版冒泡的速度快

 

这次生成范围改为2000,加强版依然没有发挥它的威力!

可见,对于大量的不重复数据来说,加强版的两条判断很难有用武之地

 

那么再设置一下,如果在重复数据较多的情况下呢?

这次我们发现,就算是只有0-10的随机数,加强版的速度仍然慢于普通版冒泡

这种情况下,选择和插入反倒是能更快一点

 

就算我们把数据设置成只有0和1的列表,结果依然不变

 

最后所幸让数据全部为1,加强版终于有所起色了,远胜于普通版,甚至是七种排序里最快的!

不过这样的数据还有什么意义呢.....

 

最后,我们生成1000个有序的数据,冒泡加强版和选择遥遥领先,直接跑出了结果!(注意看for循环)

 

可是,正当我们高兴,加强版总算有起色时~

只要我们再给这组数据中间,插入一条无序数据。。。

 

结果。。。。。。

 

总结:冒泡排序的加强版,能加强的地方太少了,我觉得不能称之为加强版,在绝大多数无序数据的情况下,它的效率都不如普通版冒泡快,只有极个别的已经有序的情况,才能有所提升,但意义并不大。

果然,程序的世界里和现实也是一样的,能原装就不要魔改,魔改后的东西还不如原装的呢。。。

 

更多内容请访问: bookist123.picp.net

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章