《演算法筆記》中摘取
2-路歸併排序的非遞迴寫法主要考慮到這一點:每次分組時組內元素個數上線都是2的冪次。於是就可以想到這樣的思路:令步長step的初值為2,然後減陣列中每個step個元素作為一組,將其內部進行排序(即把左step / 2個元素與右step / 2個元素合併,而若元素個數不超過step / 2,則不操作);再令step 乘以 2,重複上面的操作,直到step / 2超過元素個數n。
const int maxn = 100;
//將陣列a的[l1, r1]與[l2, r2]區間合併為有序區間(此處l2記為r1 + 1)
void merge(int a, int l1, int r1, int l2, int r2) else
}while(i <= r1) temp[index++] = a[i++]; //將[l1, r1]的剩餘元素加入序列temp
while(j <= r2) temp[index++] = a[j++]; //將[l2, r2]的剩餘元素加入序列temp
for(i = 0; i < index; i++)
}void mergesort(int a) }}
}//使用sort函式代替merge函式
void mergesort(int a)
//此處可以輸出歸併排序的某一趟結束的序列
}}
2 路歸併排序(非遞迴)
此篇只說此方法排序的難點 和易錯點。include 合併過程 int maxn 1000 void merge int a,int l1,int r1,int l2,int r2 else while i r1 while j r2 就在當前陣列中重新賦值 for int i 0 i既是易錯點,也是...
歸併排序(遞迴與非遞迴寫法)
本文同步發布在csdn 歸併排序的基本操作是將兩個有序陣列合併成乙個有序陣列,原理是運用分治思想,遞迴地將乙個陣列的左右兩部分有序數列進行歸併。c c 的遞迴實現 1 遞迴寫法2 34 include 5 include 6 define elementtype int 自定義資料型別 7using...
書上講解 歸併排序的非遞迴寫法
描述 題解 讓區間的長度l為1,2,4,2 n 1 然後對每個位置i開始的長度為l的區間歸併有序,用歸併排序的方法就好,然後i跳轉到i l 複雜度仍然是log2 n n級別的,注意寫的時候的一些細節。比如一定要讓最後l n的情況進行過一次,不然無法保證整個序列是有序的 歸併排序非遞迴寫法 inclu...