一月#
PdqSort - Pattern-defeating Quicksort#
- Date:
2022-01-28
拜读了 👤 zhangyunhao116 写的 Go 泛型版本的 PdqSort 实现:⛺ zhangyunhao116/pdqsort。 PdqSort 是一种较先进的 unstable 的混合排序算法,在 Boost 和 Rust 中均有使用。
- 小规模数据:
insertion sort
- 默认情况:
改进的 quick sort
- 表现不好时:
heap sort 以保证最坏的复杂度 \(O(n\log n)\)
改进的 quick sort#
- 选取 pivot
采样,取中位数
- 处理 common case
- 近似有序
- 衡量:
取样判断是否近似有序(选取 pivot 时顺便做的)
- 策略:
Partial insertion sort(改进的插入排序)
- 大量重复元素
- 衡量:
Sub-array 之外左侧的值(肯定比 sub-array 里的值小)等于选中的 pivot
- 策略:
提前将重复元素排在一起,避免下次选中其作为 pivot
- 抵抗 bad case
- 近似逆序时
- 衡量:
取样判断是否近似有序
- 策略:
反转数组
- Pivot 表现不佳
- 衡量:
上次 partition 的 pivot 的位置离 sub-array 两端很近
- 策略:
Shuffle 若干元素,如果还是不佳,fallback 到 heap sort
评论
如果你有任何意见,请在此评论。 如果你留下了电子邮箱,我可能会通过 回复你。