会飞的蝌蚪君

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

归并排序 详见大话数据结构p406

  1 /*
  2 #归并排序(MergeSort)
  3 #主要的思想:
  4 #1: 分  将我们待排序的序列分割成为一个个的子序列
  5 #2:合  将子序列进行序列间排序,然后归并到一个序列之中
  6 
  7 #主要的方法有:递归和非递归
  8 
  9 */
 10 
 11 //递归策略:
 12 
 13 void Mergesort(sqlist* L)
 14 {
 15     Msort(L->r,L->r,1,L->length);
 16     
 17 }
 18 
 19 
 20 void Msort(int SR[],int TR1[],int s,int t)
 21 {
 22     int m;
 23     int TR2[MAXSIZE+1];
 24     if(s==t)
 25         TR1[s]=SR[s];
 26     else
 27     {
 28         m=(s+t)/2;
 29         Msort(SR,TR2,s,m);
 30         Msort(SR,TR2,m+1,t);
 31         merge(TR2,TR1,s,m,t);
 32         
 33     }
 34     
 35 }
 36 
 37 
 38 void merge(int SR[],int TR[],int i,int m,int n)
 39 {
 40     int j,k,l;
 41     for(j=m+1,k=1;i<=m,j<=n;k++)
 42     {
 43         if(SR[i]<SR[j])
 44             TR[k]=SR[i++];
 45         else
 46             TR[k]=SR[j++];
 47     
 48     }
 49     if(i<=m)
 50     {
 51         for(l=0;l<m-i;l++)
 52             TR[k+1]=SR[i+1];
 53         
 54     }
 55     if(j<=n)
 56     {
 57         for(l=0;l<n-j;l++)
 58             TR[k+1]=SR[j+1];
 59         
 60     }
 61 }
 62 
 63 
 64 
 65 //非递归策略:
 66 
 67 void MergeSort2(sqlist* L)
 68 {
 69     int* TR = (int*)malloc(L->length*sizeof(int));
 70     int k =1;
 71     while (k<L->length)
 72     {
 73         MergePass(L->r,TR,k,L->length);
 74         k *= 2;
 75         MergePass(TR,L->r,k,L->length);
 76         k *= 2;
 77     }
 78 }
 79 
 80 
 81 void MergePass(int SR[],int TR[],int s,int n)
 82 {
 83     int i=1;
 84     int j;
 85     while(i<= n-2*s-1)
 86     {
 87         Merge(SR,TR,i,i+s-1,i+2*s-1);
 88         i=i+2*s;
 89         
 90     }
 91     if(i<n-s+1)
 92         Merge(SR,TR,i,i+s-1,n);
 93     else
 94         for(j=i;j<=n;j++)
 95             TR[j]=SR[j];
 96 }
 97 
 98 void merge(int SR[],int TR[],int i,int m,int n)
 99 {
100     int j,k,l;
101     for(j=m+1,k=1;i<=m,j<=n;k++)
102     {
103         if(SR[i]<SR[j])
104             TR[k]=SR[i++];
105         else
106             TR[k]=SR[j++];
107     
108     }
109     if(i<=m)
110     {
111         for(l=0;l<m-i;l++)
112             TR[k+1]=SR[i+1];
113         
114     }
115     if(j<=n)
116     {
117         for(l=0;l<n-j;l++)
118             TR[k+1]=SR[j+1];
119         
120     }
121 }

 

posted on 2018-04-16 19:47  会飞的蝌蚪  阅读(130)  评论(0)    收藏  举报