分治法(divide-and-conquer),「分治法策略」是一種很重要的演算法。顧名思義,「分而治之」。將原問題劃分成n個規模較小,而結構與原問題相似的子問題;遞迴地解決這些子問題,然後再合併其結果,就得到原問題的解。
「分治策略」是很多高效演算法的基礎,如快速排序、歸併排序、傅利葉變換(快速傅利葉變換)。
備註:合併排序(merge sort)演算法完全按照上述模式,步驟如下:如何劃分子問題的規模?從大量實踐中發現,在用分治法設計演算法時,最好使子問題的規模大致相同。換句話說,將乙個問題分成大小相等的k個子問題的處理方法是行之有效的。許多問題可以取k = 2。這種使子問題規模大致相等的做法是出自一種平衡(balancing)子問題的思想,它幾乎總是比子問題規模不等的做法要好。
元素標頭檔案 myelement.h
#define myelement_h_included
#define n 10
#define lq(a,b) ((a)<=(b))
typedefint elementtype;
void print(elementtype e, int n);
#endif // myelement_h_included元素原始檔 myelement.c
#include"myelement.h"
void print(elementtype e, int n)合併排序標頭檔案 mergesort.h
#define mergesort_h_included
#include"myelement.h"
void mergesort(elementtype e, int n);
void main_mergesort();
#endif // mergesort_h_included合併排序原始檔 mergesort.c
#include"mergesort.h"
#include"myelement.h"
void merge(elementtype sr,elementtype tr,int i,int m,int n)
void msort(elementtype sr,elementtype tr1,int s, int t)
}
/* 歸併排序 */
void mergesort(elementtype e, int n)
void main_mergesort()
;
printf("排序前:\n");
print(d,n);
mergesort(d,n);
printf("排序後:\n");
print(d,n);
printf("\n");
}
再者,若有乙個陣列,查詢其中最大值和最小值,也可以採用分治演算法。
#include
#define m 10
/* 求乙個陣列中最大值和最小值的分治演算法
引數:
s 當前分治段的開始下標
e 當前分治段的結束下標
meter 表的位址
max 儲存當前搜尋到的最大值
min 儲存當前搜尋到的最小值
*/
void maxmin(int s,int e,int meter,int *max,int *min)
else
return ;
}
i = s + (e-s)/2;
maxmin(s,i,meter,max,min);
maxmin(i+1,e,meter,max,min);
}
void main()
;
int max = int_min; /* 用最小值初始化 */
int min = int_max; /* 用最大值初始化 */
printf("the array's max & min value as followed:\n");
maxmin(0,m - 1,meter,&max,&min); /* 分治法獲取最值 */
printf("\nmax : %d\nmin : %d\n",max,min);
}
分治法 合併排序
合併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用 分治法 divide and conquer 的乙個非常典型的應用。合併排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。將已有序的子串行...
分治法 合併排序
排序演算法是對一組數進行順序排序或者逆序排序,而合併排序就是排序演算法的一種。合併排序用到了分治策略實現對元素進行排序。合併排序的基本思想 把待排序的n個元素分解成n組,也就是每組乙個元素 之後對分好的組進行兩兩合併 無配對的則不操作 以此類推。以序列為例,排序過程如下 合併排序又叫做2 路歸併排序...
基礎演算法 合併排序(分治法)
基礎演算法 合併排序演算法 分治法 的宗旨是將問題 分解 處理 歸併 將書中的偽 翻譯為c c 語言實現,大致可用兩個函式來解決問題,第乙個函式實現 治 也就是分解問題,處理問題 的步驟,另乙個函式通 過遞迴實現 分 合 的操作。實現 分 治 的函式實現如下 void merge int parra...