演算法導論第三版 桶排序

2022-08-03 07:51:10 字數 1671 閱讀 4059

理解了基數排序,也就理解了桶排序。

桶排序就是基數排序的一種優化,從msd開始,即取最高位來排一次序,如果最高位沒有重複(意味著沒有衝突需要處理),是演算法的最佳狀態,o(n)。

如果有衝突,就將衝突的元素存放到對應的桶裡(**就是乙個鍊錶或者陣列或者stl容器),然後對每個桶進行一次插入排序,平均情況的話衝突很小的,桶裡的元素的數量就不多,速度很快,

如果衝突集中在幾個桶甚至乙個桶裡,那麼就出現了演算法的最差情形,也就是o(n^2)的複雜度。

下面是例子**實現:

1 template2

void bucket_sort(_init first, _init last, short

decimal_bits)

1516 typename vector< vector<_valuetype> >::iterator ite =v.begin();

17 less_equal<_valuetype>cmp;

18 it =first;

1920

for(; ite!=v.end(); ++ite)

26 }

上面預設採用了遞增排序,如果要遞減,就反向迭代並使用greater_equal。

為圖簡便,這裡把元素直接放到輸入的容器了。

整個測試程式:

1 #include 2 #include 3 #include 4

5using

namespace

std;

67 template8

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

1920 template21

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

2425

int bucket_index(int num, int

p) 31

32 template33

void bucket_sort(_init first, _init last, short

decimal_bits)

4647 typename vector< vector<_valuetype> >::iterator ite =v.begin();

48 less_equal<_valuetype>cmp;

49 it =first;

5051

for(; ite!=v.end(); ++ite) 57}

5859 template60

void print(const vector&v)

6566

intmain() ;

68 vector v(lst, lst+10

);69

70 bucket_sort(v.begin(), v.end(), 2

);71

print(v);

7273

return0;

74 }

寫完這些例子,在準備刷難度高一點的演算法之前,小小的總結了一下。

這些例子的適用範圍都很小,僅供學習使用,比如上面的插入排序,迭代器僅僅對vector有效,如果有自己的資料結構容器,最好是為它實現乙個隨機訪問迭代器。

演算法導論第三版習題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 後面一樣...

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

a a.leng th 9 故從i a.l engt h 2 4開始呼叫max heapify a,i a 4 9 8 故交換a 4 和a 8 得到新的序列a1 b 接下來呼叫max heapify a,3 a 7 3 6 故交換a 3 和a 6 得到a2 c 第三步呼叫max heapify a,...