另外乙個版本:
先進行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...