一直以来都认为快速排序是最优的排序算法,所以认为STL中的sort函数也采用快速排序,但事实好像复杂的多。

 1 问题思考

  • 数据量大和数据量小都适合用快速排序吗?
  • 递归过深会引发什么问题?
  • 怎么控制递归深度?如果达到递归深度了还没排完序怎么办?

2 问题解答

  • 数据量小不适合用快速排序,因为频繁的递归调用会带来额外的负担;
  • 递归过深容易引起堆栈溢出;
  • 当递归层次过深时,该换堆排序,因为堆排序的时间复杂度恒为Ο(nlogn);

3 STL中的sort

  STL中的sort结合了快速排序、堆排序和直接插入排序(排序算法的详细介绍参见排序算法的性能分析 - BeLady - 博客园 (cnblogs.com),基本的流程如下图:

  

 

  简单来说就是,设置一个长度阈值$l$,和一个深度阈值$d$,当待排序元素数量大于等于l时,使用快速排序,且当快速排序的递归深度达到d时,改用堆排序;当待排序元素数量小于l时,选用直接插入排序,因为直接插入排序在序列接近于有序时性能最优

本人研究牲一枚,敬请各位大佬批评指正~~~

posted on 2023-03-12 14:53  BeLady  阅读(23)  评论(0编辑  收藏  举报