快速排序的缓存性能

时间:2014-07-06 18:05:08

标签: algorithm sorting caching quicksort

我最近遇到了这个疑问。

我们选择快速排序合并排序,因为快速排序的缓存性能优于合并排序。 有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

平均情况不存在!

由于最佳和最坏的情况通常是在实践中很少发生的极端情况,因此进行了平均案例分析。但任何平均案例分析都假设一些输入分布!对于排序,典型的选择是随机置换模型(在维基百科上默认假设)。

为何选择O-Notation?

抛弃算法分析中的常数是出于一个主要原因:如果我对确切的运行时间感兴趣,我需要(相对)所有相关基本操作的成本(甚至仍然忽略缓存问题,现代处理器中的流水线...... )。数学分析可以计算每条指令的执行频率,但单条指令的运行时间取决于处理器的详细信息,例如: 32位整数乘法是否需要与加法相同的时间。

有两种方法:

修复一些机器型号。

这是在Don Knuth的书籍系列“The Computer of Computer Programming”中为作者发明的人造“典型”计算机完成的。在第3卷中,您可以找到许多排序算法的精确平均大小写结果,例如

Quicksort:11.667(n + 1)ln(n)-1.74n-18.74 Mergesort:12.5nnn(n) 堆:16nln(n)+ 0.01n Insertionsort:2.25n2 + 7.75n-3ln(n)几种排序算法的运行时间

这些结果表明Quicksort是最快的。但是,它仅在Knuth的人工机器上得到证明,它并不一定意味着你的x86 PC。另请注意,算法与小输入的关联方式不同: 用于小输入的几种排序算法的运行时间

分析抽象基本操作。

对于基于比较的排序,这通常是交换和密钥比较。在Robert Sedgewick的书中,例如“算法”,这种方法是追求的。你找到那里

Quicksort:2nln(n)比较和平均13nln(n)交换 Mergesort:1.44nln(n)比较,但高达8.66nln(n)数组访问(mergesort不基于交换,因此我们无法计算)。 Insertionsort:平均14n2比较和14n2交换。 如您所见,这并不容易将算法比较为精确的运行时分析,但结果与机器详细信息无关。