前面看完了插入排序和插入排序後面習題裡面的選擇排序,最近又把歸併排序給看了。
插入排序的最壞情況為n平方,當然選擇排序的恒為n平法,而歸併排序則是乙個nlogn的時間複雜度。當然這指的是在n無限大的情況下才可以成立,對於元素個數很小的,插入排序反而會快一些。
歸併排序的主要思想就是利用了分治法把大的問題劃分成相同型別,比較小規模的子問題來解決。
下面貼今天敲得**:(在對排序好的陣列進行merge的時候,採用了兩種方法,區別在於是否採用了監視哨)
//mergesort
#include using namespace std;
const int max = 0x3f3f3f3f;
void merge(int a,int p,int q,int r)//帶有監視哨的寫法
{ int lsize = q - p +1;
int rsize = r - q;
int *l = new int[lsize+1];
int *r = new int[rsize+1];
int i = 0,j = 0;
for(i = 0;i
在監視哨的使用中使用了max,來表示無窮大的情況。
查閱了相關的部落格,如果我們已經知道了我們需要的數的範圍,那麼這個max的取值就很簡單了。
對於一般不知道的情況,大部分採用的是0x7fffffff,這個值在直接比較時不會有任何問題,但是如果參與運算之後再去比較就會有溢位問題。
所以另一種是採用0x3f3f3f3f。這樣表示的數在加完之後不會溢位。。
參見部落格:
當然這個歸併排序我已經看了好幾遍,自己動手寫的時候還是會出現錯誤。。。
歸併排序 演算法導論學習
歸併排序利用分治的思想進行排序,採用遞迴形式進行排序 舉個栗子 給乙個五個元素的陣列,下標從0到4 把其分為兩個部分 0,1,2和3,4 兩個部分都有序了再合併 0,1,2再分為兩個部分0,1和2 兩個部分都有序了再合併 比較0,1,的大小使其有序,2是乙個數字,也有序,將這兩個有序的合為乙個有序的...
演算法導論 歸併排序
public class mergesort mergesort data,0,中間 mergesort data,中間,最後 merge data,0,最後 system.out.println 排序前 for int i 0 i9 i 10 0 system.out.println system...
演算法導論 歸併排序
演算法的設計有很多思想,之前的插入排序使用的是增量的方法,即在排好的子陣列a中,將元素a j 插入,形成新的子陣列a。這次將實現另一種排序 歸併排序,歸併排序採用了 分治法 divide and conquer 本篇中包含 分治法,也可以稱為分治策略 是將乙個大規模的問題 原問題 劃分成n個規模較小...