Quicksort的算法是:
Quicksort(A,p,r)
if p<r then
q<- partition(A,p,r)
Quicksort(A,p,q-1)
Quicksort(A,q+1,r)
根据我的说明,Quicksort(A,1,n)的成本是T(n)= T(q)+ T(n-q)+分割成本。
为什么成本是这样而不是:T(n)= T(q-1)+ T(n-q)+分配成本?
为什么最坏情况下的成本T(n)= T(n-1)+Θ(n)?
答案 0 :(得分:1)
我对第二个问题的答案更有信心。
在最坏的情况下,枢轴总是可以变成阵列中的最小数字(或最高数字)。在这种情况下,分开的阵列的长度分别为n-1和0。因此,递归关系应为:
T(n)= T(n-1)+T(0) + Work done for partition
= T(n-1) + 0 + O(n)
例如,在最坏的情况下,如果数组最初按升序排序,并且您决定始终选择第一个元素作为枢轴。
Initial Array: {1, 2, 3, 4, 5}
Pivot Element: 1.
Partitioned arrays: {} and {2,3,4,5}
Next pivot element: 2
Partitioned arrays: {} {3,4,5}
...
在这里你可以看到,在每个分区,问题的大小只减少1而不是减半。
Hence T(n) = T(n-1) + Work done for partitioning( O(n) )
答案 1 :(得分:1)
执行时间复杂度分析时,仅考虑具有最高指数的条款。这是因为当输入变大时,只有具有最高指数的术语仍然相关。例如:O(0.0001n^3 + 0.002n^2 + 0.1n + 1000000) = O(n^3)
。它遵循T(q-1) = T(q)
,因为-1
与q
的大值无关。
我不确定您的笔记是否完全准确。 user1990169已经很好地回答了为什么一般的Quicksort具有O(n^2)
的最差情况时间复杂度,但实际上可能花费O(n)
时间来确定未排序的n
元素数组的中位数,这意味着我们总是可以在每次迭代中选择枢轴的中值(最佳值)。 T(n)=T(n-1)+Θ(n)
的时间复杂度可能来自一个所有元素具有相同值的数组,在这种情况下,根据实现,除了pivot之外的所有元素都可以放入 LEFT 分区或 RIGHT 分区。但是,通过一些巧妙的实现,即使这样也可以避免。因此,T(n)=T(n-1)+Θ(n)
的复杂性分析可能来自Quicksort的特定实现,而不是最佳实现。