接著上一回的說,對
stl幾種排序演算法做一比較,比較並不全面,僅僅對
std::sort()
、std::stable_sort()、c
標準庫qort
和std::heap_sort()
做一比較,因為這是用的最多的,其底層實現已足夠說明日常生活中排序問題所需要考慮的問題。
程式**如下:1 2
3 45 6
7 89 10
11 12
13 14
15 16
17 18
19 20
21 22
23 24
25 26
27 28
29 30
31 32
33 34
35 36
37 38
39 40
41 42
43 44
45 46
47 48
49 50
51 52
53 54
55 56
57 58
59 60
61 62
63 64
65 66
67 68
69 70
71 72
73 74
75 76
77 78
79 80
81 82
83 84
85 86
87 88
89 90
91 92
93 94
95 96
97 98
99 100
101102
103104
105106
107108
109110
111112
113114
115116
117118
119120
121122
123124
125126
127128
129130
131132
133134
// 本檔案實現了乙個隨機數發生器,其速度和隨機特性均遠遠優於標準庫,感謝
chipset
的指點。
#ifndef mtrandom_hpp_
#define mtrandom_hpp_
#include
classmtrandom
explicitmtrandom(size_t seed) : left(1)
mtrandom(size_t* init_key, int key_length) : left(1)
if(j >= key_length)
j =0; }
for(k = n -
1; k; --k) }
state[0]
=2147483648ul; // msb is 1; assuring non-zero initial array }
void reset(size_t rs)
size_t rand()
double real()
// generates a random number on [0,1) with 53-bit resolution
double res53()
private:
void init(size_t seed =
19650218ul) }
void next_state()
size_t mixbits(size_t u, size_t v)const
size_t twist(size_t u, size_t v)const
staticconstint n =
624, m =
397;
size_t state[n];
size_t left;
size_t* next;
}; classmtrand_help
voidoperator()(size_t s)
size_toperator()()const
doubleoperator()(double)
}; mtrandom mtrand_help:: r;
externvoid mtsrand(size_t s)
externsize_t mtirand()
externdouble mtdrand()
#endif
// mtrandom_hpp_
以下為測試檔案。1 2
3 45 6
7 89 10
11 12
13 14
15 16
17 18
19 20
21 22
23 24
25 26
27 28
29 30
31 32
33 34
35 #include
#include
#include
usingstd::cout;
#include
#include "mtrandom.h"
intmain(int argc, char
*argv)
結果如下圖所示:
由圖可以得知,
sort
是最快的排序演算法,深入其底層源**我們發現,
sort
其實是一種混合排序,採用基本的分割演算法,當
pivot
偏向一邊的時候自動轉化為堆排序,當已經基本分割成較小的片段基本有序時,採用插入排序,這樣得以保持很快的排序速度。
stable_sort
,穩定排序,採用歸併排序和,基本有序的時候採用插入排序,消耗記憶體較多,如果沒有足夠的記憶體則退化成
o(nlogn * logn)
的時間複雜度。
qsort,c
語言的初學者對他應該很熟悉,採用三點取中的辦法獲取
pivot
,但是最壞的情況下退化成
o(n * n)
的時間複雜度,本測試採用隨機數,應該是最理想的,但是他速度並不是很快,主要原因是本身設計問題,由於比較需要頻繁的呼叫比較函式,導致速度大大下降。
heap_sort
雖然時間複雜度仍舊是
o(nlogn)
,但是速度很慢,不過需要的額外記憶體很少。本來我還想好好分析一下
stl底層原始碼的實現的,但是攤開侯捷伯伯的《
stl原始碼剖析》,已經將這些演算法的原始碼來龍去脈講解得一清二楚了,要想再說得更明白更精彩很難呀
~呵呵。
幾種排序演算法比較
資料結構 10 排序十 四 排序 sort thinking in algorithm 12.詳解十一種排序演算法 排序法平均時間 最差情形 穩定度額外空間 備註冒泡 o n2 o n2 穩定o 1 n小時較好 交換o n2 o n2 不穩定o 1 n小時較好 選擇o n2 o n2 不穩定o 1 ...
c 幾種STL比較
stl工作和面試考的比較多了,下面整理一下。1 vector 變長一維陣列,連續存放的記憶體塊,有保留記憶體,堆中分配記憶體 支援操作,高效率的隨機訪問 在最後增加元素時,一般不需要分配記憶體空間,速度快 在中間或開始操作元素時要進行記憶體拷貝效率低 vector高效的原因在於配置了比其所容納的元素...
幾種排序演算法的比較
1.分類 非線性時間比較類排序 通過比較來決定元素間的相對位置關係,由於其時間複雜度不能突破o nlogn 因此稱為非線性時間比較類排序。線性時間比較類排序 不通過比較來決定元素間的相對位置關係,它可以突破基於比較排序的時間下界,以線性時間執行,因此稱為線性時間比較類排序。2.複雜度 3.演算法相關...