如何选择合适的排序算法
-
首先不能选择线性排序,适用场景特殊
-
选择排序时间复杂度为O(nlogn)
- 一般选择快排
- 归并发虚需要O(n)的空间复杂度,不适合通用排序
\
如何优化快速排序
-
什么情况下时间复杂度退化成O(n^2)
- 当数据有序或接近有序,每次选取的分区点分区不明显\
-
本质原因:在基本有序的情况下,分区点选择不够合理
- 如果分区点两边数据量接近最好
-
优化分区点选取
-
三数取中法
- 从首、尾、中间,分别取出一个数,选择中间的那个数\
-
随机法
- 不能保证每次选择最优点,也不太可能选择最差点
-
-
优化递归导致的堆栈溢出
- 限制递归深度,超出阈值则停止递归
- 手动模拟反函数调用栈
Glibc中qsort
-
qsort
- 默认使用归并排序来排序输入数据
- 当数据量变大后使用快速排序
- 当数据量小于4之后使用插入排序(利用哨兵提升性能)
-
避免堆栈溢出
- 手动模拟堆栈进出
总结
-
常规的排序算法都采用O(nlogn) 排序算法
-
快排的优化
-
合理选择分区点\
-
避免递归太深
-