归并排序 详见大话数据结构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 }
浙公网安备 33010602011771号