快速排序算法的运行时分析

时间:2016-06-27 13:15:18

标签: algorithm big-o quicksort

我正在阅读CLRS并正在观看Tim Roughgarden在Coursera上的斯坦福大学算法课程。算法的运行时间分析基于将比较阵列中的两个条目的概率。理解起来不是很容易,所以我尝试用其他方式进行分析,但我不确定它是否正确。

基本上我尝试计算每次调用分区子例程时返回的预期枢轴索引。

每次调用分区子例程时,允许 pivot 返回预期的pivot索引。 enter image description here

enter image description here

这表明我们可以预期分区子程序将平均分割子数组。使用递归树图示,可以很容易地显示树的深度将是 log(n),并且在树的每个级别上, O(n)为分区子阵列。这是对的吗?

1 个答案:

答案 0 :(得分:1)

您的计算是正确的,但解释不是。

数据透视索引的平均值不会直接影响效果分析。

想象一下一个非常糟糕的枢轴选择:它选择第一个或最后一个索引,概率为1/2。在这种情况下:

pivot = 1 * 1/2 + n * 1/2 = (n + 1) / 2 ≈ n / 2

然而,这显然是选择枢轴的最糟糕的策略 - 它将导致二次行为。

您需要的是直接计算算法的运行时间。它将比仅仅是枢轴索引的函数更复杂(我想,实际上太复杂了)。

一个更可行的想法是问自己这样的问题:

  

显然,pivot的索引并不总是n/2。但是,它几乎总是接近于此。它会走多远?或者,更正式地说,枢轴指数的概率大于例如n/4来自理想值?如果这个概率足够低,我们可以将树的平均深度限制为O(log n)吗? (我想是的)