我正在阅读介绍排序。我了解其中的大部分内容,但我不明白为什么大多数实现倾向于对其中的快速排序部分进行一次递归。快速排序的标准实现使用两个递归进行快速排序。
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);
}
我做了两个修改,一个是我现在使用两个递归,第二个是我跳过了递归的枢轴元素,因为它已经在正确的位置。
无论有没有我的修改,程序似乎都运行良好。但我想知道为什么他们在大多数在线实现中使用单递归。