big-o - 快速排序算法 - 只需要 n-1 比较的分区。我怎样才能做到这一点?
问题描述
“我们已经看到 partition() 执行 n 次比较(可能是 n-1 或 n+1,具体取决于实现)。”
来源:http ://homepages.math.uic.edu/~leon/cs-mcs401-r07/handouts/quicksort-continued.pdf
如果我采用 1、2、3、4、5、6、7、8 之类的序列(8 作为枢轴元素,n = 8),我认为我至少有 8 个比较而不是 7(n-1)
如果我从左向右移动以找到一个大于 8 的元素
- 1 < 8
- 2 < 8
- 3 < 8
- 4 < 8
- 5 < 8
- 6 < 8
- 7 < 8
至少再进行一次比较,以检查我是否找到了一个小于 8 的元素 / 以检查 indizes 是否被交叉。8. 我 < j
分区的哪个实现只需要 n-1 个比较?
解决方案
当枢轴从未移动且从未与自身进行比较时,会发生 n-1 次比较,例如 Lomuto 分区方案。
https://en.wikipedia.org/wiki/Quicksort#Lomuto_partition_scheme
Hoare 分区方案进行更多比较,但通常它比 Lomuto 进行更少的交换。
https://en.wikipedia.org/wiki/Quicksort#Hoare_partition_scheme
在我的基准测试中,我发现 Lomuto 对于几乎没有重复的伪随机数据稍微快一些。如果重复的数量很大,Hoare 更快,并且在所有相等元素的情况下,它是 Lomuto 的最坏情况 O(n^2) 和 Hoare 的最佳情况 O(n log2(n))。
推荐阅读
- java - 如何从 WMQTextMessage.java 获取 ByteBuffer 正文而不是调用 getText()?
- installation - 布朗尼 - 安装问题
- excel - 对象“形状”的方法“复制”失败:运行时错误“-2147221040 (800401d0)”
- bash - 时间上传部分 bash 脚本并在 MM:SS 中输出
- c++ - 2个范围的所有组合的迭代器
- javascript - 找到特殊字符时如何从字符串中拆分一部分
- php - Woocommerce Display Termmeta
- python - 解析 HTML 并从标签的字符串中提取数据(JSON 格式)
- c# - 如何使用来自另一个项目的枚举将单选按钮组绑定到枚举属性?
- python-3.x - 时区感知字段之间的 Django 聚合