algorithm - 为什么快速排序排除中间元素而归并排序包含它?

标签 algorithm sorting quicksort mergesort

我正在研究快速排序的实现(来自 CLRS 第 3 版)。我发现数组的递归划分从低索引到中间-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会忽略从0q-1q的中间元素+1r 没有包含 q 而合并排序有?

最佳答案

Quicksort 将所有小于基准的元素放在一侧,将所有大于基准的元素放在另一侧。在这一步之后,我们知道枢轴的最终位置将在这两者之间,这就是我们放置它的位置,因此我们不需要再次查看它。

因此我们可以在递归调用中排除枢轴元素。

Mergesort 只是选择中间位置,直到稍后才对该元素做任何事情。无法保证该位置的元素已经在正确的位置,因此我们需要稍后再次查看该元素。

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

关于algorithm - 为什么快速排序排除中间元素而归并排序包含它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53034471/

相关文章:

c - 我需要使用包含 2 个数字的公式为数组下标生成 144 个唯一数字

python - 随机移动 Python 列表中一定数量的项目

c# - 排序列表<xyz <String,String >>,错误: InvalidOperationException的问题

algorithm - BruteForceMedian 算法似乎具有二次效率。 (为什么?)

javascript - Turf JS 交叉口问题

java - Java从Map中获取值的范围

java - 改进 Mitchell 的最佳候选算法

c++ - 创建 C++ vector 的排序拷贝的最高效方法是什么?

javascript - 如何使用事件驱动比较编写 QuickSort?

java - 如何生成快速排序算法的最坏情况?