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...