pdqsort | 青训营笔记

135 阅读1分钟

插入排序、快速排序、堆排序

不同场景下的使用情况

image.png

  • 当元素有序或者说元素长度不长的情况下,插入排序的性能是最好的
  • 在大部分情况下快速排序的性能最好
  • 堆排序在任何情况下排序的性能都很稳定

pdqSort

通过综合上面三种排序算法的优点在不同场景下选择不同的排序算法来提高排序算法的执行效率

V1

  • 对于短序列使用插入排序(小于一定长度)
  • 其他情况下使用快速排序进行排序
  • 当快速排序表现不好时,使用堆排序来对数组进行排序

Q&A

1.短序列长度

12 ~ 32

2.如何判断快速排序情况不好

当最终pivot的位置离序列两端很接近时(距离 < length/8)判断其变现不佳,当limit数==0时切换成堆排序 (limit 计数器)

image.png

V2

通过改变pivot 中位数的选择来提高快速排序的效率来提高算法的效率 关于pivot的选择,需要在简单与性能高之间进行一个平衡,以便达到比较好的预期 pivot的选择

  • 短序列( ≤8) 选择固定元素
  • 中序列( ≤50),采样3个元素 (median of three)
  • 长序列(>50),采样9个元素 (median of medians)

image.png

V3 (对数组中可能出现重复元素度较高的情况进行优化)

最后对重复元素很多的情况进行一个优化 当检测到此时的pivot和上次相同时(发生在leftSubArry),使用partitonEqual将重复元素排列在一起,减少重复元素对于pivot选择的干扰 最终的架构图

image.png