Quicksort最糟糕的表现

时间:2012-08-19 02:30:49

标签: algorithm quicksort asymptotic-complexity

我试图证明Quicksort算法的以下最坏情况,但是遇到了一些麻烦。最初,我们有一个大小为n的数组,其中n = ij。我们的想法是,在Quicksort的每个分区步骤中,您最终得到两个子阵列,其中一个大小为i,另一个大小为i(j-1)。在这种情况下,我是一个大于0的整数常量。我已经绘制了一些示例的递归树,并理解为什么这是最坏的情况,并且运行时间将是theta(n ^ 2)。为了证明这一点,我使用迭代方法来求解递推方程:

T(n) = T(ij) = m if j = 1
T(n) = T(ij) = T(i) + T(i(j-1)) + cn if j > 1

T(i) = m
T(2i) = m + m + c*2i = 2m + 2ci
T(3i) = m + 2m + 2ci + 3ci = 3m + 5ci

所以看起来复发是:

                  j 
T(n) = jm + ci * sum k - 1 
                 k=1

此时,我有点迷失了该做什么。它看起来最后的总和将导致j ^ 2如果展开,但我需要表明它在某种程度上等于n ^ 2。关于如何继续这一点的任何解释将不胜感激。

2 个答案:

答案 0 :(得分:1)

注意,快速排序算法最坏情况是当你有两个大小为0和n-1的子问题时。在这种情况下,每个级别都有这个递推方程:

T(n)   = T(n-1) + T(0) < -- at first level of tree
T(n-1) = T(n-2) + T(0) < -- at second level of tree
T(n-2) = T(n-3) + T(0) < -- at third level of tree
.
.
.

每个级别的成本总和是算术系列:

        n       n(n-1)
T(n) = sum k =  ------ ~ n^2 (for n -> +inf)
       k=1        2

是O(n ^ 2)。

答案 1 :(得分:0)

这是一个简单的数学问题。您正确计算的复杂性是

O(jm + ij ^ 2)

你发现的是一个参数化的复杂性。标准O(n ^ 2)包含在下面 - 假设i = 1你有一个标准的基本情况,所以m = O(1)因此j = n因此得到O(n ^ 2)。如果你把ij = n你得到O(nm / i + n ^ 2 / i)。现在您应该记住的是,m是i的函数,取决于您将使用什么作为基本案例算法因此m = f(i)因此您留下O(nf(i)/ i + n ^ 2 / i )。现在再次注意,因为没有用于一般排序的线性算法,因此f(i)= omega(ilogi)将给出O(nlogi + n ^ 2 / i)。所以你只有一个自由度就是我。检查对于i的任何值,你不能将它降低到nlogn以下,这是基于比较的最佳界限。

现在我感到困惑的是你正在做一些快速排序的最坏情况分析。这不是它的完成方式。当你说最坏的情况时,它暗示你正在使用随机化,在这种情况下,最坏的情况总是在i = 1时,因此最坏的情况界限将是O(n ^ 2)。在R. Motwani和Raghavan的随机算法书中解释了一个优雅的方法,如果你是程序员,那么你看看Cormen。