此外,我见过人们在堆排序中使用术语“不稳定”。这意味着什么?
稳定排序维护了具有相同键的项目的相对顺序。例如,想象一下您的数据集包含具有员工ID和姓名的记录。初始顺序为:
1, Jim
2, George
3, Jim
4, Sally
5, George
您想按名称排序。稳定排序将按以下顺序排列项目:
2, George
5, George
1, Jim
3, Jim
4, Sally
请确认以下翻译是否符合要求:
请注意,“George”重复的记录与它们在初始列表中的相对顺序相同。两个“Jim”记录也是如此。
而不稳定的排序可能会像这样排列项目:
如果符合要求,请回复“确认”。5, George
2, George
1, Jim
3, Jim
4, Sally
Heapsort不是稳定的,因为对堆的操作可能会改变相等项的相对顺序。并非所有的Quicksort实现都是稳定的。这取决于您如何实现分区。
尽管Heapsort的最坏情况复杂度为O(n log(n))
,但这并不能说明全部。在实际应用中,存在常数因素,理论分析无法考虑到这些因素。在Heapsort和Quicksort之间,事实证明可以通过某些方法(例如5个中位数),使Quicksort的最坏情况非常罕见。此外,维护堆不是免费的。
对于具有正常分布的数组,Quicksort和Heapsort都将以O(n log(n))
运行。但是Quicksort将更快,因为其常数因子小于Heapsort的常数因子。简单来说,分区比维护堆更快。
O(n log(n))
。然而经验研究表明,通常情况下,快速排序(和其他排序算法)比堆排序要快得多,尽管其最坏时间复杂度为O(n²)
:http://www.cs.auckland.ac.nz/~jmor159/PLDS210/qsort3.html
此外,从维基百科上的快速排序文章可以看到:
然而,在需要响应时间保证的应用程序中,永远不应使用快速排序!快速排序的最直接竞争对手是堆排序。堆排序的最坏运行时间始终为O(n log n)。但是,堆排序被认为平均比标准原地快速排序略慢。这仍在研究中,并且有些出版物表明相反[13][14]。Introsort是快速排序的一种变体,当检测到坏情况时切换到堆排序以避免快速排序的最坏运行时间。如果事先知道需要堆排序,则直接使用它比等待introsort切换到堆排序更快。
没有万能的解决办法...
还有一个观点我在这里还没看到:
如果你的数据集非常巨大,无法放入内存中,那么归并排序是一个很好的选择。它经常用于数据跨越数百台机器的集群。
稳定的排序算法可以保持具有相等键的记录的相对顺序。
一些应用程序喜欢这种稳定性,大多数则不关心,例如谷歌是你的朋友。
至于你声称“人们使用像归并排序或快速排序这样的排序机制”,我敢打赌,大多数人使用他们语言内置的任何东西,并不太考虑排序算法。那些自己编写代码的人可能从未听说过堆排序(最后一个是个人经验)。
最后一个也是最重要的原因是,并不是每个人都想要一个排序的堆。有些人想要排序列表。如果普通的程序员老板说“给这个列表排序”,而Joe说“这里有一个您从未听说过的堆数据结构,老板!”,那么Joe的下一个绩效评估将不会太好。