introsort(內省排序)

本文轉載於:https://blog.csdn.net/sky453589103/article/details/51116264算法

快速排序是一種很快的算法,它平均的時間複雜度WieO(nlgn), 最壞時間複雜度爲O(n^2)。可是快排有不少改良版,其中一種就是內省式的快排,在STL中的快快排使用的就是這種算法。 數組

1.爲何須要這種算法

由於快排在面對小數組(好比大小爲10的數組)且基本有序的狀況下,它的表現還沒插入排序要好。由於數組的基本有序,使得插入排序不用不少次的執行元素的移動,而且能夠避免遞歸。 在SGI STL中的函數sort使用的排序算法其實就是內省式的排序算法。內省的排序算法是基於快排實現的。假設待排序的數組大小爲n,去一個k值,使得k爲知足2^k <= n的最大值。k爲最大的遞歸層次、 爲何要設置最大遞歸層次呢? 由於快排的遞歸層次過深的時候,極可能會退化成O(n^2)。內省式排序使用k來控制快排的遞歸深度,當快排的遞歸深度到達k的時候選擇使用heap排序。 函數

2. 爲何不一開始就使用heap排序

heap排序在平均時間複雜度是O(nlgn),最壞狀況也是O(nlgn),看起來要比快排要快。可是實際上,快排是要比heap排序要快,第一個緣由是:heap排序雖然和快排在平均狀況下的時間複雜度是O(nlgn),可是heap排序的時間常數要比快排的時間常數要大。第二個緣由是:據統計,快排的最壞狀況在是不多發生的。第三個緣由是:快排可以比較好的吻合程序的空間局部性原理,由於它操做的基本都是相鄰的元素(虛擬存儲器的設計理論基礎中就有程序的時間局部性和空間局部性),可以減小內存缺頁中斷的發生次數。 優化

3.爲何要使用heap排序呢

 由於在遞歸層次太深的時候,就意味着發生最壞狀況的機率大大的提高了,這時候由於heap排序的最壞狀況下的時間複雜度是O(nlgn)比快排的O(n^2)要好,所以使用heap排序能更好優化排序效率。spa

 

參考資料:《STL源碼剖析》.net

相關文章
相關標籤/搜索