イントロソートについて読んでいました。私はそのほとんどを理解していますが、ほとんどの実装がそのクイックソート部分に対して1つの再帰を持つ傾向がある理由を理解できません。クイック ソートの標準実装では、クイック ソートに 2 つの再帰を使用します。
Intro sort, main logic:
private static void introsort_loop (int[] a, int lo, int hi, int depth_limit)
{
while (hi-lo > size_threshold)
{
if (depth_limit == 0)
{
heapsort(a, lo, hi);
return;
}
depth_limit=depth_limit-1;
int p=partition(a, lo, hi, medianof3(a, lo, lo+((hi-lo)/2)+1, hi-1));
introsort_loop(a, p, hi, depth_limit);
hi=p;
}
insertionsort(a, lo, hi);
}
ここで、同じものを次のように変更してみました。
private static void introsort_loop (int[] a, int lo, int hi, int depth_limit)
{
if (hi-lo > size_threshold)
{
if (depth_limit == 0)
{
heapsort(a, lo, hi);
return;
}
depth_limit=depth_limit-1;
int p=partition(a, lo, hi, medianof3(a, lo, lo+((hi-lo)/2)+1, hi-1));
introsort_loop(a, p + 1, hi, depth_limit);
introsort_loop(a, lo , p-1 , depth_limit);
}
insertionsort(a, lo, hi);
}
私は 2 つの変更を行いました。
私の変更の有無にかかわらず、プログラムは正常に動作するようです。しかし、オンラインのほとんどの実装で単一再帰を使用する理由を知りたかったのです。