STL學習筆記之sort演算法

2021-07-03 03:55:57 字數 1647 閱讀 3139

stl所提供的各式各樣的演算法中,sort()是最複雜龐大的乙個。這個演算法接受兩個隨機訪問迭代器,然後將區間內的所有元素以漸增方式由小到大重新排列。還有個版本則允許使用者指定乙個仿函式,作為排序標準。

stl中的所有關係型容器都擁有自動排序功能,所以不需要sort演算法。序列式容器中的stack,deque和priority_queue都有特別的入口,不允許使用者對元素排序。剩下的vector,deque和list,list或slist應該使用它們自己提供的成員函式sort()。也就是說,只有vector和deque適合使用sort演算法。

stl中的sort演算法,資料量大時採用quick sort,分段遞迴排序。一旦分段後的資料量小於某個門檻,為避免quick sort的遞迴呼叫帶來過大的額外負荷,就改用insertion sort。如果遞迴層次過深,還會改用heap sort。sgi stl中,基於此種考慮的sort演算法稱為introspective sort,即introsort。

對於introsort,我想有兩個問題需要弄清:

1,當資料量小到什麼程度時,使用insertion sort?

2,當遞迴層次多深時,改用heap sort?

我們可以先看看introsort的原始碼實現:

templateinline void sort(randomaccessiterator first,

randomaccessiterator last)

}//__lg()用來控制分割惡化的情況

templateinline size __lg(size n)

templatevoid __introsort_loop(randomaccessiterator first,

randomaccessiterator last,

t*,size depth_limit)

--depth_limit;

randomaccessiterator cut = __ungruarded_partion(first,

last,

t(__median(*first,

(first + (last-first)/2)

*(last - 1))));

//對右半段遞迴進行sort

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

last = cut; //這種寫法可讀性較差,回到while迴圈,準備對左半段進行遞迴。

}}template void __final_insertion_sort(randomaccessiterator first,

randomaccessiterator last)

else

__insertion_sort(first, last);

}

總結下這段**的意思:如果資料量小於16,則直接使用insert sort;若資料量大於16,且沒有超過最大遞迴深度(2*logn),則採用quick sort,將所有元素分成size小於16的資料段,最後採用insert sort整體排序(基本有序的情況下,insert sort效率很高);若遞迴深度超過最大遞迴深度,則這部分資料採用heap sort。

在rw版的stl中,sort演算法採用的是純粹的quick sort。



STL(排序演算法sort)

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

STL排序演算法sort

要使用stl中的演算法,需要在程式標頭檔案引入 include 1.對基本型別的陣列從小到大排序 sort 陣列名 n1,陣列名 n2 n1和n2都是int型別的表示式,可以包含變數 如果n1 0,則 n1可以不寫 將陣列中下標範圍為 n1,n2 的元素從小到大排序。下標為n2的元素不在排序區間內 ...

STL排序演算法sort

sort 陣列名 n1,陣列名 n2 注意排序區間是 n1,n2 左閉右開。預設為從小到大排序,如果想要從大到小排序,需要加引數sort 陣列名 n1,陣列名 n2,greater include includeusing namespace std int main sort a,a 5 for ...