囧,道理很簡單,實踐起來卻沒那麼簡單。因為程式語言的語言元素跟演算法描述資料結構並不完全一致。
經過迭代(此處省略800字),補充上對於歸併排序對於小陣列採用插入排序的**。
首先是插入排序:
1 template2void __insert_sort(_init first, _init last, _func&func) 12}
1314 template15
void insert_sort(_init first, _init last, _func&func)
然後是普通的歸併排序:
1 template2void __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 template2void __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 56using
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 後面一樣...