幾種STL排序演算法比較

2021-05-22 20:04:11 字數 3656 閱讀 4017

接著上一回的說,對

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.演算法相關...