什么叫分治法?
int len1=q-p+1;
int len2=r-q;
int L[len1],R[len2];
for(int i=0;i
L[i]=a[i+p];
for(int j=0;j
R[j]=a[j+q+1];
int i=0,j=0,k=p;
while (i < len1 && j < len2)
if (L[i] < R[j])
a[k++] = L[i++];
else
a[k++] = R[j++];
while (i < len1)
a[k++] = L[i++];
while (j < len2)
a[k++] = R[j++];
int q;
if(p
{
q=(p+r)/2;
MergeSort(a,p,q);
MergeSort(a,q+1,r);
Merge(a,p,q,r);
}
int a[10]={1,2,4,3,5,6,8,9,7,0};
MergeSort(a,0,9);
//Merge(a,0,4,9);
for(int i=0;i<10;i++)
printf("%d ",a[i]);
将原问题分解为几个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解。
分治模式在每层递归时都有三个步骤:
分解原问题为若干子问题,这些子问题是原问题的规模较小的实列
解决这些子问题,递归地求解各子问题。然后,若干子问题的规模足够小,直接求解。
合并这些子问题的解成原问题的解
接下来我们就归并排序来说明什么是分治法.
分解:分解待排序的n个元素的序列成各据n/2个元素的两个子序列。
解决:使用归并排序递归的排序两个子序列。
合并:合并两个已排序的子序列以产生已排序的答案。
其实这些都可以说是将简单的事情说复杂了,你看看代码在领悟领悟吧,哈哈~~
#include
void Merge(int *a,int p,int q,int r)
{
}
void MergeSort(int *a,int p,int r)
{
}
int main()
{
}