我正在研究quicksort的实现(来自CLRS 3rd Edition)。我发现数组的递归除法从低索引到中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)
因为他们两个都使用除法策略,所以为什么快速排序会忽略中间元素,因为它们从0
到q-1
和q+1
到r
合并排序中没有包含q
吗?
答案 0 :(得分:3)
Quicksort 将所有小于一侧的元素放置在一侧,而所有另一侧则放置更大的元素。完成此步骤后,我们知道枢轴的最终位置将在这两个位置之间,这就是我们将其放置的位置,因此我们无需再次查看它。
因此,我们可以在递归调用中排除数据透视元素。
合并排序只是选择中间位置,直到稍后再对该元素不执行任何操作。无法保证处于该位置的元素已经在正确的位置,因此我们稍后需要再次查看该元素。
因此,我们必须在递归调用中包括中间元素。
答案 1 :(得分:1)
两种方法都采用划分策略,但是方式不同
Mergesort(最常见的实现)将数组递归地分成相等(如果可能)大小的部分,中间索引是固定位置(对于给定的数组长度)。递归调用完全处理数组的左部分和右部分。
Quicksort 分区子例程将枢轴元素放置在所需的(最终)位置(在大多数情况下,枢轴索引不在中间)。无需进一步处理此元素,并且递归调用会处理该元素之前和之后的部分。