algorithm - 为什么快速排序排除了中间元素而归并排序包含了它?
问题描述
我正在查看快速排序的实现(来自 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)
由于它们都使用了相同的划分策略,为什么快速排序忽略中间元素,因为从0
到q-1
和q+1
到r
没有q
包含在其中,而合并排序有?
解决方案
快速排序将所有小于枢轴的元素放在一侧,将所有大于枢轴的元素放在另一侧。在这一步之后,我们知道枢轴的最终位置将在这两者之间,这就是我们放置它的位置,所以我们不需要再次查看它。
因此,我们可以在递归调用中排除枢轴元素。
Mergesort只是选择中间位置,直到稍后才对该元素执行任何操作。无法保证该位置的元素已经在正确的位置,因此我们需要稍后再查看该元素。
因此,我们必须在递归调用中包含中间元素。
推荐阅读
- excel - VBA - 查找所有订单组合和计数
- java - 是否需要额外检查将字符串解析为 LocalDate 对象?
- sql - 如何使用 pdo 在 ajax 生成的更新表中创建选择框,其中的值来自 sql 表
- python - 如何将 CSV 作为流表源加载到 PyFlink 中?
- sql - 我想在我的超级碗数据表中添加一个选择语句,但是我将如何添加一个选择,它会在 SQL 中显示每个团队的胜利?
- macos - 如何从删除 zsh 中恢复
- c++ - 如何正确链接和编译 raylib?
- oauth-2.0 - 在 Apache Nifi InvokeHTTP 处理器中添加授权标头
- selenium-webdriver - 使用 Selenium 计算 WebTable 中的隐藏行数
- python - 防止 itertools.islice 修改行