//@1--將陣列a先一分為2
//@2--將陣列兩兩進行判斷並在陣列a比較之後的最小元素放進d陣列中
//@3--當兩組比較完後,進行條件判斷
//@4--當剩下的是左邊時,則說明是右邊的開始界限已經超出了範圍,則進行迴圈將剩下的陣列直接copy到d陣列
//@5--當剩下的是右邊時,則說明是左邊的開始界限已經超出了範圍,則進行迴圈將剩下的陣列直接copy到d陣列
上面是解釋了merger合併演算法的思路
下面是實現mergersort函式的詳細思路
假設 有這樣一堆陣列:
8 4 5 7 1 3 6 2
其實這演算法就是類似二叉樹,下面分解
8 4 5 7 1 3 6 2
8 4 5 7 1 3 6 2
8 4 5 7 1 3 6 2
4 8 5 7 1 3 2 6///merger(兩兩排序並且合併)
4 5 7 8 1 2 3 6
1 2 3 4 5 6 7 8
下面是**的實現:
#include#include#includeusing namespace std;
template///例如:5 25 55 10 20 30
//@1--將陣列a先一分為2
//@2--將陣列兩兩進行判斷並在陣列a比較之後的最小元素放進d陣列中
//@3--當兩組比較完後,進行條件判斷
//@4--當剩下的是左邊時,則說明是右邊的開始界限已經超出了範圍,則進行迴圈將剩下的陣列直接copy到d陣列
//@5--當剩下的是右邊時,則說明是左邊的開始界限已經超出了範圍,則進行迴圈將剩下的陣列直接copy到d陣列
void merger(type a,type d,int left,int mid,int right)///將有序的兩個陣列進行合併(也叫合併排序)
if(i>mid)///當左邊的界限超出範圍時,則說明剩下最右邊的陣列;
else
}templatevoid mergersort(type a,int left,int right)
{ int d[right];
if(left執行結果如下:
演算法實驗 分治法實現合併排序
歸併排序 先解決小規模的問題。將問題分解,將陣列分為兩個小的陣列。遞迴的解各子問題,將函式中分解的兩個小的陣列再進行以上兩個步驟,最後都化為小規模問題。將各子問題的解進行合併最終得到原問題的解。void merge int a,int b,int l,int r else if i mid else...
分治演算法之合併排序
合併排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列 1 分解 將待排序元素分成大小大致相同的兩個子串行 2 治理 對兩個子串行進行合併排序 3 合併 將排好序的有序子串行進行合併,得到最終的有序序列 合...
分治演算法(二)合併排序
1.問題分析 合併排序問題給定的是乙個無序的序列,可以把待排序的元素分解為兩個規模大致相等的子串行。如果還是不容易解決就繼續將子串行分解,直到子串行中的元素個數為1,因為單個元素的序列本身是有序的,此時便可以進行合併,從而得到乙個完整的有序序列。2.演算法設計 1 分解 將待排序元素分成大小大致相同...