演算法導論第三版 插入排序和歸併排序

2022-08-03 07:51:11 字數 1662 閱讀 6933

囧,道理很簡單,實踐起來卻沒那麼簡單。因為程式語言的語言元素跟演算法描述資料結構並不完全一致。

經過迭代(此處省略800字),補充上對於歸併排序對於小陣列採用插入排序的**。

首先是插入排序:

1 template2

void __insert_sort(_init first, _init last, _func&func) 12}

1314 template15

void insert_sort(_init first, _init last, _func&func)

然後是普通的歸併排序:

1 template2

void __merge(_init first, _init last, _func&func)

1819

for(; lit != lv.end() && it != last+1; ++lit, ++it) *it = *lit;

20for(; rit != rv.end() && it != last+1; ++rit, ++it) *it = *rit;21}

2223 template24

void __merge_sort(_init first, _init last, _func&func) 31}

3233 template34

void merge_sort(_init first, _init last, _func&func)

歸併排序中的小陣列採用插入排序:

1 template2

void __merge_sort(_init first, _init last, int k, _func&func) else12}

13}1415 template16

void merge_sort(_init first, _init last, int k, _func&func)

測試函式:

1 #include 2 #include 3 #include 4 #include 5

6using

namespace

std;

78 template9

void print(const vector&v)

1415 template16

void

print(_init first, _init last)

2122

intmain() ;

24 vector v(lst, lst+8

);25

26 lessl;

27insert_sort(v.begin(), v.end(), l);

28print(v);

2930

int lst2 = ;

31 vector v2(lst2, lst2+8

);32 less_equallq;

3334 merge_sort(v2.begin(), v2.end(), v2.size()/2

, lq);

35//

merge_sort(v2.begin(), v2.end(), lq);

36print(v2);

3738

return0;

39 }

演算法導論第三版 桶排序

理解了基數排序,也就理解了桶排序。桶排序就是基數排序的一種優化,從msd開始,即取最高位來排一次序,如果最高位沒有重複 意味著沒有衝突需要處理 是演算法的最佳狀態,o n 如果有衝突,就將衝突的元素存放到對應的桶裡 就是乙個鍊錶或者陣列或者stl容器 然後對每個桶進行一次插入排序,平均情況的話衝突很...

演算法導論第三版習題5 2

正好僱傭一次說明第一次僱傭的就是所有應聘者中最好的,所以概率為1n 正好僱傭 n 次說明所有應聘者按優秀從低到高依次出現,第一位是最差的,概率為1n 第二位其次,概率為1n 1,所以整體概率為1n 正好僱傭兩次,說明第乙個應聘者不是最好的,概率為n 1n,第二個應聘者是最好的,概率為1n 1,所以概...

演算法導論第三版習題5 3

在進入迴圈前,先將在整個陣列中隨機選擇乙個數至於a 1 即可 permute in place a 1 n a.length 2 swap a 1 with a random 1,n 3 for i 2 to n 4 swap a i with a random i,n 第二步其概率為1n 後面一樣...