为什么quicksort排除中间元素,而mergesort包括中间元素?

时间:2018-10-28 17:49:10

标签: algorithm sorting quicksort mergesort

我正在研究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)

因为他们两个都使用除法策略,所以为什么快速排序会忽略中间元素,因为它们从0q-1q+1r合并排序中没有包含q吗?

2 个答案:

答案 0 :(得分:3)

Quicksort 将所有小于一侧的元素放置在一侧,而所有另一侧则放置更大的元素。完成此步骤后,我们知道枢轴的最终位置将在这两个位置之间,这就是我们将其放置的位置,因此我们无需再次查看它。

因此,我们可以在递归调用中排除数据透视元素。

合并排序只是选择中间位置,直到稍后再对该元素不执行任何操作。无法保证处于该位置的元素已经在正确的位置,因此我们稍后需要再次查看该元素。

因此,我们必须在递归调用中包括中间元素。

答案 1 :(得分:1)

两种方法都采用划分策略,但是方式不同

Mergesort(最常见的实现)将数组递归地分成相等(如果可能)大小的部分,中间索引是固定位置(对于给定的数组长度)。递归调用完全处理数组的左部分和右部分。

Quicksort 分区子例程将枢轴元素放置在所需的(最终)位置(在大多数情况下,枢轴索引不在中间)。无需进一步处理此元素,并且递归调用会处理该元素之前和之后的部分。