14 | 排序优化:如何实现一个通用的、高性能的排序函数?

122 阅读1分钟

如何选择合适的排序算法

  • 首先不能选择线性排序,适用场景特殊

  • 选择排序时间复杂度为O(nlogn)

    • 一般选择快排
    • 归并发虚需要O(n)的空间复杂度,不适合通用排序

\

如何优化快速排序

  • 什么情况下时间复杂度退化成O(n^2)

    • 当数据有序或接近有序,每次选取的分区点分区不明显\
  • 本质原因:在基本有序的情况下,分区点选择不够合理

    • 如果分区点两边数据量接近最好
  • 优化分区点选取

    • 三数取中法

      • 从首、尾、中间,分别取出一个数,选择中间的那个数\
    • 随机法

      • 不能保证每次选择最优点,也不太可能选择最差点
  • 优化递归导致的堆栈溢出

    • 限制递归深度,超出阈值则停止递归
    • 手动模拟反函数调用栈

Glibc中qsort

  • qsort

    • 默认使用归并排序来排序输入数据
    • 当数据量变大后使用快速排序
    • 当数据量小于4之后使用插入排序(利用哨兵提升性能)
  • 避免堆栈溢出

    • 手动模拟堆栈进出

总结

  • 常规的排序算法都采用O(nlogn) 排序算法

  • 快排的优化

    • 合理选择分区点\

    • 避免递归太深