1. 程式人生 > >STL裏sort算法用的是什麽排序算法?

STL裏sort算法用的是什麽排序算法?

遞歸 前言 大名 https 所有 cto 底層 解決 com

本文轉載:https://blog.csdn.net/qq_35440678/article/details/80147601,感謝博主的分享!

前言

當你第一眼看到這道面試題是不是心裏在暗喜,一問算法題就比問排序算法,一問排序算法就問快速排序。
如果你回答:

STL裏的sort算法肯定用的是快速排序啊?難不成還是冒泡排序麽?

如果你只是回答快速排序,那麽恭喜你只答對了33.333%,離正確答案還差一大截。

回答完,接著會引來一堆問題轟炸:

  • 數據量大和數據量小都適合用快速排序嗎?
  • 快速排序的時間復雜度不是穩定的nlogn,最壞情況會變成n^2,怎麽解決復雜度惡化問題?
  • 快速排序遞歸實現時,怎麽解決遞歸層次過深的問題?
  • 遞歸過深會引發什麽問題?
  • 怎麽控制遞歸深度?如果達到遞歸深度了還沒排完序怎麽辦?

首先,回答用到哪種排序算法,正確答案是:

毫無疑問是用到了快速排序,但不僅僅只用了快速排序,還結合了插入排序和堆排序。

是不是很驚喜,很意外?

為什麽?直接看STL源碼實現,來源於侯捷老師翻譯的鼎鼎大名的《STL源碼剖析》關於sort算法實現的細節,實現細節有很多精彩的地方。

並非所有容器都使用sort算法

既然問的是STL的sort算法實現,那麽先確認一個問題,哪些STL容器需要用到sort算法?
首先,關系型容器擁有自動排序功能,因為底層采用RB-Tree,所以不需要用到sort算法。
其次,序列式容器中的stack、queue和priority-queue都有特定的出入口,不允許用戶對元素排序。
剩下的vector、deque,適用sort算法。

實現邏輯

STL的sort算法,數據量大時采用QuickSort快排算法,分段歸並排序。一旦分段後的數據量小於某個門檻(16),為避免QuickSort快排的遞歸調用帶來過大的額外負荷,就改用Insertion Sort插入排序。如果遞歸層次過深,還會改用HeapSort堆排序。

技術分享圖片

結合快速排序-插入排序-堆排序 三種排序算法。

STL裏sort算法用的是什麽排序算法?