归并排序

分治的思想包括了三个基本的步骤:

1.分解;

2.解决;

3.合并。

 

归并排序最主要的就是“合并”。

 

 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\n",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 }
View Code

 

posted @ 2013-11-15 17:13  偶尔会寂寞  阅读(155)  评论(0编辑  收藏  举报