歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半子表合併成為越來越大的有序序列,歸併排序包括兩個步驟,分別為:
1)劃分子表
2)合併半子表
首先我們來討論歸併演算法,歸併演算法將一系列資料放到乙個向量中,索引範圍為[first,last],這個序列由兩個排好序的子表構成,以索引終點(mid)為分界線,以下面乙個序列為例
7,10,19,25,12,17,21,30,48
這樣的乙個序列中,分為兩個子串行 7,10,19,25 和 12,17,21,30,48,如下圖所示:
再使用歸併演算法的時候的步驟如下:
第一步:比較v[indexa]=7和v[indexb]=12,將較小的v[indexa]取出來放到臨時向量temparray中,然後indexa加1
第二步:比較v[indexa]=10和v[indexb]=12,將較小的10放到臨時變數temparray中,然後indexa++;
第三步:比較v[indexa]=19與v[indexb]=12,將較小的12存放到臨時變數temparray中,然後indexb++;
第四步到第七步:按照以上規則,進行比對和儲存,得到如下結果:
最後一步:將子表b中剩餘項新增到臨時向量temparray中
然後將臨時變數中的值按照索引位置,拷貝回向量v中,就完成了對向量v的歸併排序
演算法函式為:
public void merger(int v, int first, int mid, int last)
else
}//複製沒有比較完子表中的元素
while (indexa < mid)
while (indexb < last)
int index = 0;
while (tempv.count > 0)
}實現歸併排序;歸併排序演算法分為兩步,第一步:先將原來的資料表分成排好序的子表,然後呼叫 merger 對子表進行歸併,使之成為有序表,例如有如下向量:
25,10,7,19,3,48,12,17,56,30,21
對此序列進行歸併排序的步驟為:
歸併演算法函式為
public void mergersort(int v, int first, int last)
}歸併演算法的劃分子表和歸併子表與原資料序列次序無關,因此演算法的最壞情況,最壞情況和平均情況時間複雜度是一樣的
下面是歸併演算法的函式呼叫圖
示例程式: /files/jillzhang/mergersort.rar
歸併排序(2 路歸併排序)
遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...
python歸併排序 python 歸併排序
排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...