【发布时间】:2010-11-26 22:46:43
【问题描述】:
众所周知,快速排序的平均性能为 O(n*log(n)),但合并和堆排序的平均性能也为 O(n*log(n))。所以问题是为什么快速排序平均更快。
【问题讨论】:
-
堆排序在最坏的情况下是 O(n*log(n)) - 可能在所有情况下。
标签: arrays algorithm performance sorting quicksort
众所周知,快速排序的平均性能为 O(n*log(n)),但合并和堆排序的平均性能也为 O(n*log(n))。所以问题是为什么快速排序平均更快。
【问题讨论】:
标签: arrays algorithm performance sorting quicksort
通常,快速排序显着 在实践中比其他 O(nlogn) 更快 算法,因为它的内循环可以 在大多数情况下得到有效实施 架构,以及在大多数现实世界中 数据,可以进行设计 最小化概率的选择 需要二次时间。 此外,快速排序往往会使 出色的内存使用率 层次结构,充分利用 虚拟内存和可用缓存。 虽然快速排序不是就地 排序并使用辅助内存,它是 非常适合现代计算机 架构。
还可以查看同一页面上的comparison with other sorting algorithms。
另请参阅 CS 网站上的 Why is quicksort better than other sorting algorithms in practice?。
【讨论】:
locality of reference (en.wikipedia.org/wiki/Locality_of_reference) 可以很好地工作(从而加快工作速度)
快速排序的最坏情况实际上比堆排序和归并排序更差,但平均而言,快速排序更快。
至于为什么,需要时间解释,所以我会参考Skiena, The algorithm design manual.
总结快速排序与合并/堆排序的引用:
当面对相同渐近复杂度的算法时,实现 缓存性能和内存大小等细节和系统怪癖可能 很好的证明是决定性的因素。 我们可以说的是,实验表明,在正确实施的地方 快速排序实现得很好,它通常比合并排序快 2-3 倍或 堆排序。主要原因是最内层循环中的操作是 更简单。但是当我说快速排序是 快点。这个问题的解决方案超出了我们正在使用的分析工具。 最好的判断方法是实现算法和实验。
【讨论】: