本文轉載: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