利用分治演算法實現合併排序的詳細思路

2021-08-14 13:37:39 字數 1255 閱讀 6664

//@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 分解 將待排序元素分成大小大致相同...