这是我参与「第三届青训营 -后端场」笔记创作活动的的第9篇笔记」
为什么学
- 例子-抖音直播排行榜功能
- 什么是最快的排序算法
经典排序算法
插入排序
- 将后面的元素不断插入前面已排好序的array中
- 时间复杂度
- best O(n) 已经有序
- avg O(n^2)
- worst O(n^2) 逆序
- 缺点
- avg worst 慢
- 优点 best O(n)
快速排序
- 分治思想,不断分割序列直到序列整体有序
- 步骤
- 选定一个pivot
- 使用pivot分割序列,分成元素小于与大于pivot的两个序列
- 时间复杂度
- best O(n*logn) 每次pivot恰好为中位数
- avg O(n*logn)
- worst O(n^2) 每次只让一个元素有序
- 缺点
- worst 慢
- 优点 best avg O(nlogn)
堆排序
- 时间复杂度
- best O(n*logn)
- avg O(n*logn)
- worst O(n*logn)
- 缺点
- best O(n*logn)
理论印象
实际场景benchmark
pdqsort(pattern-defeating-quicksort)
排序算法-根据场景不同选择最优
- 一种不稳定的混合排序算法。
version1
- 短序列采用插入排序
- 其他情况用快速排序保证整体性能
- 当快速排序表现不佳时,使用堆排序来保证最坏情况下时间复杂度仍然为O(nlogn)
version2
-
根据序列长度的不同,来决定选择策略
-
优化-Pivot的选择
- 短序列<=8,选择固定元素
- 中序列<=50, 采样三个元素 median of three
- 长序列>50, 采样九个元素,median of meidans
-
pivot的采样方式使得有探知序列当前状态的能力
可能有序并非真正有序,如果排列了x次,发现还未有序,就不再继续使用插入排序
version3
- 如何优化重复元素很多的情况?
partition equal:把相同的元素都排到一起