今、私はアルゴリズムの紹介、クイックソートの章を読んでいました。末尾再帰を最適化に使用できるとのことでした。
QUICKSORT'(A, p, r)
while p < r
do ▸ Partition and sort left subarray.
q ← PARTITION(A, p, r)
QUICKSORT'(A, p, q - 1)
p ← q + 1
ただし、上記のコードのスタックの深さは、反復ごとにピボット番号が [1,n-1] [n] の場合、O(n) になります。
QUICKSORT (A, p, r )
while p < r
do Partition and sort the small subarray Þrst
q ← PARTITION(A, p, r )
if q − p < r − q
then QUICKSORT (A, p, q − 1)
p ← q + 1
else QUICKSORT (A, q + 1, r )
r ← q − 1
上記のコードで私が理解しているのは、最初に長さが短い部分配列を処理するということです。しかし、なぜ O(lgn) に還元できるのでしょうか? ピボットがまだ [1,n-1] [n] である場合、O(n) スタックの深さを維持していると思います。