合併排序,分治思想

2021-05-26 05:43:45 字數 1834 閱讀 4546

2011-06-17 22:42:09

一般分法思想分為三個步驟:

分解:將原問題分解成一系列子問題

解決:遞迴解決各子問題。若子問題足夠小,則直接求解

合併:將子問題的結果合併成原問題的解

合併排序就是用了這個思想。

分解:將n個元素分成各含 n / 2個元素的子串行

解決:用合併排序法對兩個子串行遞迴地排序

合併:合併兩個已排序的子串行以得到排序結果

子串行排序時,其長度為1時遞迴結束。單個元素已有序

下面用c實現如下

//為了計算方便,沒有使用陣列下標為0的元素,即下標從1開始

int main(void)

start = clock();

mergesort(a, 1, n);

end = clock();

printf("mergesort time:%ld/n", end - start);

// outputarray(a, n);

return 0;}

/*mergesort 採用分治法

分治模式在第一層遞迴上都有三個步驟:

分解:將原問題分解成一系列子問題

解決:遞迴解決各子問題。若子問題足夠小,則直接求解

合併:將子問題的結果合併成原問題的解

*/#include #include #include #define n 100

#define infi 0x7fffffff //吵兵,為最大int值

void insertsort(int narray, const int arraysize); //插入排序

void outputarray(int narray, const int arraysize); //輸出陣列資料

void mergesort(int narray, const int arrayleft, const int arrayright); //合併排序

void merge(int narray, const int arrayleft, const int arraymid, const int arrayright);

//假設有10個元素

//第一次分配

// |- - - - - | - - - - -|

//第二次分配

// |- - - |- - | - - - - - |

// 直到...

// | - | - | - | - - | - - - - - |

//即為終結狀態的時候開始解決問題,並合併解

void mergesort(int narray, const int arrayleft, const int arrayright)

}void merge(int narray, const int arrayleft, const int arraymid, const int arrayright)

parrayleft[i] = infi; //吵兵

for(i = 0; i < narrayr; i++) //儲存右區域

parrayright[i] = infi; //吵兵

i = j = 0;

for (k = arrayleft; k <= arrayright; k++) //合併解,至有序

else

}if (parrayleft)

free(parrayleft);

if (parrayright)

free(parrayright);

}

演算法分析 分治思想之合併排序

根據分治策略,我們建立了合併排序演算法,合併排序演算法的基本思想是 將待排序元素分成大小大致相同的兩個子集合分別對兩 個子集合進行排序,最終將排好序的子集合合併成為所要求的排好序的集合。換句話說,將乙個陣列兩個兩個結合並排序,形成小範圍有序的新的陣列,再將新的陣列四個四個結合,在此形成新的陣列以此 ...

歸併排序(分治思想)

分治 劃分問題 把序列分成元素個數盡量相等的兩半 遞迴求解 把兩半元素分別排序 合併問題 把兩個有序表合併成乙個 include include include includeusing namespace std void merge sort int a,int x,int y,int t if...

歸併排序(分治思想)

演示 具體的我們以一組無序數列 14,12,15,13,11,16 為例分解說明,如下圖所示 上圖中首先把乙個未排序的序列從中間分割成2部分,再把2部分分成4部分,依次分割下去,直到分割成乙個乙個的資料,再把這些資料兩兩歸併到一起,使之有序,不停的歸併,最後成為乙個排好序的序列。實現 include...