アルゴリズムの紹介 ではp169
、末尾再帰の使用について説明していQuicksort
ます。
この章の前半の元のクイックソート アルゴリズムは (疑似コードで)
Quicksort(A, p, r)
{
if (p < r)
{
q: <- Partition(A, p, r)
Quicksort(A, p, q)
Quicksort(A, q+1, r)
}
}
末尾再帰を使用した最適化バージョンは次のとおりです。
Quicksort(A, p, r)
{
while (p < r)
{
q: <- Partition(A, p, r)
Quicksort(A, p, q)
p: <- q+1
}
}
Partition
ピボットに従って配列をソートする場所。
違いは、2 番目のアルゴリズムQuicksort
が LHS を並べ替えるために 1 回だけ呼び出すことです。
1 番目のアルゴリズムではスタック オーバーフローが発生するのに、2 番目のアルゴリズムでは発生しない理由を誰かが説明してくれますか? それとも私は本を誤解していますか?