STL原始碼 演算法sort

2021-06-29 13:29:39 字數 1110 閱讀 5544

sort演算法接受兩個randomaccessiterators(隨機訪問迭代器),然後對區間內元素以漸增方式由小到大排序;另乙個版本允許使用者指定排序方式。

stl的所有關聯容器都擁有自動排序功能(以為底層的rb-tree是自動排序的)因此,不需要使用sort演算法。順序容器中stack、queue、priority-queue都有特定的入口和出口,不允許使用者對元素排序。剩下的vector、deque、list,其中vector、deque適合使用sort演算法,因為其迭代器屬於randomaccessiterators。而list迭代器是bidirectionalterators,slist屬於forwarditerators,都不適合sort演算法;list、slist排序,應該使用它們自己提供的成員函式sort()。

sgi stl sort演算法的思想:資料量大採用快速排序,分段排序;一旦分段後的數量小於某個門檻,為了避免快速排序的遞迴呼叫帶來過大的額外負荷,改用插入排序;如果遞迴層次過深,還會改用堆排序(參考文章《堆排序》)。

其中,stl sort演算法採用的快速排序是三數取中值法參考文章《快速排序的幾種常見實現》,該文章中快排的版本5就該方法且用到了插入排序。

當序列很小時,快速排序會產生大量的極小的子串行而產生大量的函式遞迴呼叫,因此採用插入排序,那麼,究竟多小時採用插入排序?沒有定論,5-20都可能差不多,實際最佳值因裝置而異。在我的g++ 4.4版本中,該值定義為16,也就是元素少於16個就插入排序。

有的版本的stl與sgi stl不同,它們直接使用快速排序,沒有插入、堆等排序

上面已經提到,當遞迴層次過深時,要改用堆排序,如何判斷遞迴層次呢,如下函式:

//有n個元素,那麼每次除以2,知道n為0,那麼除法次數就是遞迴深度了。

//例如n = 20,那麼遞迴深度為4

templateinline _size

__lg(_size __n)

在我的g++ 4.4版本中,該值也被定義為16。

關於基本演算法的穩定性,參考文章《基礎排序演算法總結》。

由於stl 用到了堆排序、快速排序等演算法,而這兩個演算法都不穩定,因此,sort演算法不穩定。

STL 中sort原始碼分析

以sgi的stl為例 sort有兩種過載形式 template randomaccessiterator void sort randomaccessiterator first,randomaccessiterator last template strictweakordering void s...

《STL原始碼剖析》Sort排序分析

整體而言 sort演算法在資料量大時採用quick sort 快速排序 一旦分段後的資料量小於某個門檻,為避免quick sort的遞迴呼叫帶來過大的額外負擔,就改用insertion sort 插入排序 如果遞迴層次過深,還會改用heap sort 堆排序 先分別簡單介紹quick sort in...

STL(排序演算法sort)

標頭檔案 include 1.對基本型別的陣列從小到大排序 sort 陣列名 n1,陣列名 n2 n1和n2都是int型別的表示式,可以包含變數 如果n1 0,則 n1可以不寫 將陣列中下標範圍為 n1,n2 的元素從小到大排序 如 int a sort a,a 7 對整個陣列從小到大排序 int ...