递归深度是 QuickSort 达到其基本情况之前连续递归调用的最大数量,并注意它(递归深度)是一个随机变量,因为它取决于所选的主元。
我想要的是估计快速排序的最小可能和最大可能递归深度。
以下过程描述了 QuickSort 通常实现的方式:
QUICKSORT(A,p,r)
if p<r
q ← PARTITION(A,p,r)
QUICKSORT(A,p,q−1)
QUICKSORT(A,q+1,r)
return A
PARTITION(A,p,r)
x←A[r]
i←p−1
for j ←p to r−1
if A[j] ≤ x
i ← i +1
exchange A[i] ↔ A[j]
exchange A[i +1] ↔ A[r]
return i +1
QuickSort 中的第二次递归调用并不是真正必要的;可以通过使用迭代控制结构来避免这种情况。这种技术也称为尾递归,其实现方式如下:
QUICKSORT_tail(A,p,r)
while p<r
q ← PARTITION(A,p,r)
QUICKSORT(A,p,q−1)
p ← q+1
return A
在此版本中,最近一次调用的信息位于堆栈顶部,初始调用的信息位于堆栈底部。当一个过程被调用时,它的信息被压入堆栈;当它终止时,它的信息被弹出。由于我假设数组参数由指针表示,因此堆栈上每个过程调用的信息都需要 O(1) 堆栈空间。我还相信这个版本的最大可能堆栈空间应该是 θ(n)。
那么,说了这么多,我如何估计每个 QuickSort 版本的最小可能和最大可能递归深度?我的上述推论正确吗?
提前致谢。