这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
数据结构与算法优化
- 在所有短序列和已经有序的序列当中,插入排序性能最好
- 在大部分的情况下,快速排序有比较好的综合性能
- 几乎在所有的情况下,堆排序的表现都比较稳定
Pdqsort - 简介
全称Pattern- defeating- quicksort
是一种不稳定的排序算法,他对常见的序列类型做了特殊的优化,使得在不同条件下都拥有不错的性能.
-
v1
- 对于短序列 使用插入排序
- 对于其他情况 使用快速排序
- 当快速排序表现不佳时,使用堆排序来保证最坏条件下时间复杂度仍然为nlogn
-
短序列一般是24以内
-
如何得知快速排序性能不佳?
- 最终的 pivot 位置离序列两端很近的时候,判定不佳,当这种情况发生次数过多,则切换为堆排序
- v2
思考关于pivot的选择
-
使用首个元素作为pivot:实现简单,但是往往效果不好
-
遍历数组,寻找真正的中位数 : 遍历代价很高,性能不好
-
寻找近似中位数!!! (对pivot进行采样)
- 短序列:选择固定元素
- 中序列:采样三个元素
- 长序列,采样九个元素
Pivot的采样方式使得我们有探知序列当前状态的能力
- Final version