最直接的竞争对手
快速排序是堆排序,堆排序是
通常比
quicksort, but the worst-case running
时间总是 Θ (nlogn)
usually faster, though there remains
最坏情况发生的可能性
除了内向排序变体
当遇到坏情况时切换到堆排序
如果事先知道
堆排序
如有需要,可直接使用
比等待自我介入更快
切换到它。
The secret of Quicksort is: It almost doesn't do unnecessary element swaps. Swap is time consuming.
使用 Heapsort,即使您的所有数据都已经排序,您也需要交换100% 的元素来排序数组。
With Mergesort, it's even worse. You are going to write 100% of elements in another array and write it back in the original one, even if data is already ordered.
I just compared implementations of selection, quick, merge, and heap sort to see how they'd stack up against each other. The answer is that they all have their downsides.
译者:
Quick is the best general purpose sort (reasonably fast, stable, and mostly in-place)
就个人而言,我更喜欢堆排序,除非我需要一个稳定的排序。
根据我的经验,快速并不总是 那个快速。使用快速排序作为一般排序的好处是它相当快,而且稳定。它也是一个原地算法,但是由于它通常是递归实现的,它将占用额外的堆栈空间。它也落在 O (n logn)和 O (n ^ 2)之间。某些类型的时机似乎证实了这一点,特别是当值落在一个很窄的范围内。它比对10,000,000条目进行选择排序快得多,但比合并或堆慢得多。
合并排序保证为 O (n logn) ,因为它的排序不依赖于数据。它只是做它该做的,不管你给它什么值。它也是稳定的,但是如果您不注意实现的话,非常大的排序可能会使您的堆栈崩溃。有一些复杂的就地合并排序实现,但通常需要在每个级别中添加另一个数组,以便将值合并到。如果这些数组位于堆栈上,则可能会遇到问题。
堆排序是 max O (n log n) ,但在许多情况下更快,具体取决于在 log n 深度堆中向上移动值的距离。堆可以很容易地在原始数组中就地实现,因此它不需要额外的内存,而且它是迭代的,所以在递归时不用担心堆栈溢出。对于堆排序,巨大的缺点是它不是一个稳定的排序,这意味着如果您需要它,那么它就是正确的。