为什么你会选择使用冒泡排序算法而不是其他的排序算法?
为什么你会选择使用冒泡排序算法而不是其他的排序算法?
你不会选择冒泡排序。
杜克大学的Owen Astrachan曾经写过一篇研究论文,追溯了冒泡排序(Bubble Sort: An Archaeological Algorithmic Analysis)的历史,并引用了计算机科学界传奇人物Don Knuth的话:
简单来说,除了一个响亮的名字和导致一些有趣理论问题之外,冒泡排序似乎没有什么值得推荐的地方。
该论文得出结论:
在本文中,我们调查了冒泡排序的起源以及尽管许多专家警告不要使用它,但它仍然很受欢迎的原因。通过分析其编码和运行时的复杂性,我们确认了这种警告。
冒泡排序比其他O(n2)排序算法慢;它比插入排序慢四倍,比选择排序慢两倍。虽然它在最佳情况下的行为良好(如果包括检查是否没有交换),但插入排序同样具有良好的最佳情况表现:对已排序的数组只需一次遍历。
冒泡排序在几乎所有真实数据集上都非常慢。任何良好的快速排序、堆排序或归并排序的实现都可能比它快得多。对于使用更简单的排序算法解决小型基本案例的递归排序,使用的是插入排序,而不是冒泡排序。
相关文章:为什么冒泡排序不高效?提供了更多细节。
有一种情况下,冒泡排序是最佳选择,但这只在古老的硬件上才能真正发生(基本上是像带有两个头的鼓式存储器这样的东西,你只能按顺序读取数据,并且只能处理直接相邻的两个数据项)。
除此之外,在我看来,它完全没有用处。即使是快速启动某些东西的借口也是无意义的,至少在我看来是这样。选择排序或插入排序更易于编写和/或理解。
当满足以下所有条件时:
这意味着你需要实现冒泡排序的概率不到0.000099%,也就是说,百万分之一都不到。
我怀疑这是一个陷阱问题。在一般情况下,没有人会选择冒泡排序而不是其他排序算法。唯一合理的情况是当你几乎确定输入数据已经(几乎)排好序时。
冒泡排序很容易实现。虽然“标准”实现的性能较差,但有一种非常简单的优化方法使其成为与许多其他简单算法相比的强劲竞争者。搜索“梳排序”,看看几行代码的神奇之处。快速排序仍然胜过它,但不太容易实现并且需要支持递归实现的语言。
它是一种基本的初级排序算法。对于学习if、for和while语句的初学者来说非常有用。
我可以想象程序员有些空闲时间来尝试各种排序算法。从最基础的冒泡排序开始试验是再合适不过的了(是的,这确实贬低了它的排名,但是如果有人说“排序算法”,谁不会想到“冒泡排序”呢)。
任何算法都能很容易地记住并使用冒泡排序。
当我刚开始学链表时,冒泡排序帮助我理解所有节点如何相互配合。
现在我感觉自己像在为冒泡排序做广告,所以我会安静下来。
这对于学校中的"婴儿级首次排序"练习非常有用,因为容易解释其工作原理并且易于实现。完成编写后,可能运行一次后就可以删除它,不再考虑。