分治的思想包括了三个基本的步骤:
1.分解;
2.解决;
3.合并。
归并排序最主要的就是“合并”。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //分治算法 2 #include<stdio.h> 3 #define infinite 32767 4 5 //合并 6 void Merge(int *A,int p,int q,int r) 7 { 8 int n1,n2,*L,*R,i,j,k; 9 n1=q-p+1; 10 n2=r-q; 11 L=new int[n1+1]; 12 R=new int[n2+1]; 13 for(i=0;i<n1;i++) 14 L[i]=A[p+i]; 15 for(j=0;j<n2;j++) 16 R[j]=A[q+j+1]; 17 L[i]=infinite; 18 R[j]=infinite; 19 i=0; 20 j=0; 21 for(k=p;k<=r;k++) 22 { 23 if(L[i]<=R[j]) 24 { 25 A[k]=L[i]; 26 i++; 27 } 28 else 29 { 30 A[k]=R[j]; 31 j++; 32 } 33 } 34 delete[] L; 35 delete[] R; 36 } 37 38 //分解 39 void Merge_sort(int *A, int p, int r) 40 { 41 if(p<r) 42 { 43 int q =(p+r)/2; 44 printf("p=%d ",q); 45 Merge_sort(A,p,q); 46 Merge_sort(A,q+1,r); 47 Merge(A,p,q,r); 48 } 49 } 50 51 int main() 52 { 53 int a[5]={5,4,3,2,1}; 54 Merge_sort(a,0,4); 55 for(int i=0;i<5;i++) 56 printf("%2d",a[i]); 57 return 0; 58 }