一直以来都认为快速排序是最优的排序算法,所以认为STL中的sort函数也采用快速排序,但事实好像复杂的多。
1 问题思考
- 数据量大和数据量小都适合用快速排序吗?
- 递归过深会引发什么问题?
- 怎么控制递归深度?如果达到递归深度了还没排完序怎么办?
2 问题解答
- 数据量小不适合用快速排序,因为频繁的递归调用会带来额外的负担;
- 递归过深容易引起堆栈溢出;
- 当递归层次过深时,该换堆排序,因为堆排序的时间复杂度恒为Ο(nlogn);
3 STL中的sort
STL中的sort结合了快速排序、堆排序和直接插入排序(排序算法的详细介绍参见排序算法的性能分析 - BeLady - 博客园 (cnblogs.com),基本的流程如下图:

简单来说就是,设置一个长度阈值$l$,和一个深度阈值$d$,当待排序元素数量大于等于l时,使用快速排序,且当快速排序的递归深度达到d时,改用堆排序;当待排序元素数量小于l时,选用直接插入排序,因为直接插入排序在序列接近于有序时性能最优
本人研究牲一枚,敬请各位大佬批评指正~~~
浙公网安备 33010602011771号