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

2022-07-29 12:27:11 字數 1407 閱讀 3300

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

insertion sort以雙層迴圈的形式進行,外迴圈便利整個序列,每次迭代決定出乙個自區間,內迴圈遍歷自區間,將自區間內的沒乙個「逆轉對」倒轉過來。所謂「逆轉對」是指任何兩個迭代器i,j,i

templatevoid __insertion_sort(randomaccessiterator first,randomaccessiterator last)

template inline void__linear_insert(randomaccessiterator first,random accessiterator last,t*)

else//尾不小於頭

__unguarded_linear_insert(last,value);

}templatevoid __unguarded_linear_insert(randomaccessiterator first,random accessiterator last,t value)

*last=value;

}

quick sort是目前已知的最快的排序法,平均複雜度為o(nlogn),最壞情況下將達o(n²)。不過introsort(非常類似於median-of-three quicksort的一種排序演算法)可將最壞情況推進到o(nlogn)。早期的stlsort演算法都採用quicksort,sgi stl已經改用introsort。

median-of-three(三點之中值):任意乙個元素都可以被送來當樞軸(pivot),但其合適與否將影響quicksort的效率,為了避免「元素當初輸入時不夠隨機」所帶來的惡化效應,最理想的最穩當的方法就是取整個序列的頭、尾、**三個位置的元素,以其中值作為樞軸,這種做法成為median-of-three partitioning,或成為median-of-quicksort,為了能夠快速取出**位置的元素,顯然迭代器必須能夠快速取出**位置的元素,顯然迭代器必須能夠隨機讀取,亦即是個randomaccessiterators。

sort採用的優化方案,即前面的所有排序步驟都採用quicksort,只有最後一次採用insertionsort,因為insertionsort在面對「幾近排序」的序列時,能擁有很好的表現。

其行為在大部分情況下幾乎與median-of-three quick sort完全相同(當然也就一樣快,但是當分割行為有惡化為二次行為的傾向時,能夠自我檢測,轉而改用heap sort,使得效率維持在heapsort的o(nlogn),又比一開始就用heapsort來得好。

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...

STL原始碼剖析

花了兩天時間略讀了一下 stl原始碼分析 看了個大體,對於細節並沒有深究。之所以想翻翻這本書,主要是想看看stl中的特性 介面卡的具體實現。看完之後收穫還是蠻大的,模板的各種組合讓我眼前一亮,下面大概總結一些內容。1.記憶體分配 sgi記憶體分配採用兩級實現,對於大記憶體塊的申請 大於128k 由第...