本文转载:https://blog.csdn.net/qq_35440678/article/details/80147601,感谢博主的分享!html
当你第一眼看到这道面试题是否是内心在暗喜,一问算法题就比问排序算法,一问排序算法就问快速排序。
若是你回答:面试
STL里的sort算法确定用的是快速排序啊?难不成仍是冒泡排序么?
若是你只是回答快速排序,那么恭喜你只答对了33.333%,离正确答案还差一大截。算法
回答完,接着会引来一堆问题轰炸:ui
首先,回答用到哪一种排序算法,正确答案是:spa
毫无疑问是用到了快速排序,但不单单只用了快速排序,还结合了插入排序和堆排序。
是否是很惊喜,很意外?.net
为何?直接看STL源码实现,来源于侯捷老师翻译的鼎鼎大名的《STL源码剖析》关于sort算法实现的细节,实现细节有不少精彩的地方。翻译
既然问的是STL的sort算法实现,那么先确认一个问题,哪些STL容器须要用到sort算法?
首先,关系型容器拥有自动排序功能,由于底层采用RB-Tree,因此不须要用到sort算法。
其次,序列式容器中的stack、queue和priority-queue都有特定的出入口,不容许用户对元素排序。
剩下的vector、deque,适用sort算法。code
STL的sort算法,数据量大时采用QuickSort快排算法,分段归并排序。一旦分段后的数据量小于某个门槛(16),为避免QuickSort快排的递归调用带来过大的额外负荷,就改用Insertion Sort插入排序。若是递归层次过深,还会改用HeapSort堆排序。htm
结合快速排序-插入排序-堆排序 三种排序算法。blog