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

2021-07-02 17:11:17 字數 947 閱讀 5231

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

stl中的sort()函式在資料量大的時候採用quick sort,分段後的資料量小於某乙個門檻時便採用insertion sort。

之所以採用insertion sort,是因為當劃分的資料量小於某乙個門檻或者待排序的序列接近有序的時候,insertion sort雖然時間複雜度是o(n^2),但是仍然比quick sort好。

void __insertion_sort(raiterator first, rasiterator last)

inline void __linear_insert(raiterator first, raiterator last, t*)

else

__unguarded_linear_insert(last, value);

}void __unguarded_linear_insert(raiterator last, t value)

*last = value;

}

quick sort 大家都很熟悉,平均時間複雜度是o(n log n),最壞時間複雜度o(n^2)。

如果序列中元素個數為0或者1,結束;

選取序列中某個元素,當做樞軸(pivot)v;

將序列劃分為l和r兩段,l內的元素都小於等於v,r中的元素都大於等於v;

對l和r遞迴執行quick sort。

任何乙個元素都可以被選做樞軸,比如隨機選取,固定選取。但是劃分的兩端越均勻,執行效率越高;如果其中一段長度為0,那就出現了最壞情況。最理想的選取方法是選取頭、尾和中間三個元素中大小處於中間的那個元素作為樞軸。這樣可以避免出現最壞情況。

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

另外乙個版本 先進行introsort,基本有序後再使用insertion sort。introsort是改進的quick sort,為了防止最壞情況發生,它使用 lg 函式控制分割惡化的情況。元素個數檢查,大於16個才進行後續操作 分割層次檢查,分割層次超過指定值就使用heap 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...