分治法与归并排序

什么叫分治法?

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