C 之STL中sort函式的內部實現(二)

2021-07-02 17:12:20 字數 873 閱讀 3841

另外乙個版本:

先進行introsort,基本有序後再使用insertion sort。introsort是改進的quick sort,為了防止最壞情況發生,它使用__lg()函式控制分割惡化的情況。

元素個數檢查,大於16個才進行後續操作;

分割層次檢查,分割層次超過指定值就使用heap sort;

全部檢查通過後使用quick sort,使用median-of-3方法確定樞軸位置;

對左右半段遞迴進行intro sort。

全部內容結束後, 序列已經基本有序,再次呼叫一次insertion sort。

inline void sort(raiterator first, raiterator last)

}//控制分割惡化,找出滿足2^k <= n時,k的最大值。

inline size __lg(size n)

void __introsort_loop(raiterator first,raiterator last,t*,size depth_limit)

--depth_limit;

////上面這個鏈結裡有介紹,__median是選三值的中值作為樞軸。下面這個函式是quick sort

raiterator cut = __unguarded_partition(first,last,__median(*first,*(first+(last-first)/2),*(

last-1)));

//遞迴右半段

__introsort_loop(cut,last,value_type(first),depth_limit);

last = cut;//回到while迴圈,對左半段再次進行sort

}}

C 之STL中sort函式的內部實現(一)

stl中提供了乙個sort 函式,用於排序。它的實現雖然是基於我們熟悉的quick sort,insertion sort,heap sort,但是內部卻龐大複雜。sort 函式只能接受randomaccessiterators,list slist都不能使用。stl中的sort 函式在資料量大的時...

STL中的sort函式

b站二面時,面試官問了乙個問題,沒打出來感覺挺虧的。問題是 stl中的sort函式用的什麼排序演算法?這個問題我之前看面經的時候,看了一眼,但是當時沒有仔細研究過。大致知道裡面用了快速排序。stl的sort 演算法,資料量大時採用quick sort,分段遞迴排序。一旦分段後的資料量小於某個閾值,為...

stl排序之sort函式

stl容器的排序,支援隨機訪問的容器vector,deque,string沒有sort成員,可呼叫std sort排序 list排序呼叫自帶的list sort。下面是std sort函式,有兩個版本 template void sort randomaccessiterator first,ran...