为什么quicksort的平均速度比其他人快?

Mic*_*ael 8 arrays sorting algorithm performance quicksort

我们知道,快速排序性能平均为O(n*log(n)),但合并和堆性能平均也是O(n*log(n)).所以问题是为什么quicksort的平均速度更快.

Chr*_*heD 9

维基百科建议:

通常,快速排序在实践中比其他O(nlogn)算法快得多,因为它的内循环可以在大多数架构上有效地实现,并且在大多数现实世界的数据中,可以做出设计选择,以最小化需要二次方的概率.时间.此外,quicksort倾向于充分利用内存层次结构,充分利用虚拟内存和可用缓存.虽然quicksort不是就地排序并使用辅助内存,但它非常适合现代计算机体系结构.

还要看一下同一页面上的其他排序算法的比较.

另请参见为什么quicksort在实践中比其他排序算法更好?在CS网站上.

  • 该算法按顺序遍历,这有助于实现良好的“引用局部性”(http://en.wikipedia.org/wiki/Locality_of_reference),从而使您的缓存正常工作(从而加快工作速度) (2认同)
  • 由于高速缓存行大小,正在顺序读取存储器的算法可能已经在(快速)高速缓存中具有随后可用的下一项.为什么不能影响速度而不是以不可预测的方式遍历内存位置的算法呢? (2认同)
  • @Michael:quicksort在缓存方面有两个优点.首先是顺序访问 - 读取和写入点以一种方式在内存中移动,这意味着您一次只能访问几个页面,并且预取很有可能正常工作.比较插入排序中的二进制搜索,它不访问任意数量的位置(在每个传递中),但访问分散的位置,因此每次访问可能会更慢.其次,自上而下的递归提供了一种缓存遗忘的形式 - 一旦你正在处理的部分小于一个页面,一切都会大大加快. (2认同)
  • (并不是插入排序是我们正在比较的n个日志排序之一,但实际上快速排序和插入排序之间的比较非常重要,因为通常使用快速排序,您希望以惊人的大数组大小切换到插入排序,插入变快的地方).Mergesort也是顺序访问.当然,Heapsort有一些访问结构,但有点到处都是. (2认同)

Mil*_*lan 7

快速排序的最坏情况实际上比堆排序和归并排序更糟糕,平均而言,快速排序更快。

至于为什么,需要时间解释,因此我将参考Skiena,算法设计手册。

总结快速排序与合并/堆排序的引用:

当面对相同渐进复杂度的算法时,实现细节和系统特性(例如缓存性能和内存大小)很可能被证明是决定性因素。我们可以说的是,实验表明,在正确实施的快速排序实施得很好的情况下,它通常比归并排序或堆排序快 2-3 倍。主要原因是最内层循环中的操作更简单。但是,如果您不相信我说快速排序更快,我无法与您争论。这是一个问题的解决方案超出了我们正在使用的分析工具。最好的判断方法是实现算法和实验。