我在看quicksort的实现(来自clrs第三版)。我发现数组的递归除法是从低索引到中间-1,然后再从中间+1到高。
QUICKSORT(A,p,r)
1 if(p < r)
2 q = PARTITION(A,p,r)
3 QUICKSORT(A,p,q-1)
4 QUICKSORT(A,q+1,r)
合并排序的实现如下:
MERGE-SORT(A,p,r)
1 if(p < r)
2 q = (p+r)/2 (floor)
3 MERGE-SORT(A,p,q)
4 MERGE-SORT(A,q+1,r)
5 MERGE(A,p,q,r)
由于这两种方法都使用相同的除法策略,为什么quicksort忽略了中间元素,因为从
0
到q-1
,q+1
到r
中没有包含q
,而mergesort中有? 最佳答案
快速排序将所有小于轴的元素放在一侧,而所有大于轴的元素放在另一侧。在这一步之后,我们知道轴心的最终位置在这两个之间,这就是我们放它的地方,所以我们不需要再看它。
因此,我们可以在递归调用中排除pivot元素。
mergesort只选择中间位置,直到稍后才对该元素执行任何操作。无法保证处于该位置的元素已经位于正确的位置,因此我们需要稍后再次查看该元素。
因此,我们必须在递归调用中包含中间元素。