归并算法
将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]。
void Merge(RedType SR[],RedType TR[],int i,int m,int n) { /* 将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n] */ int j,k,l; for(j=m+1,k=i;i<=m&&j<=n;++k) /* 将SR中记录由小到大地并入TR */ if LQ(SR[i].key,SR[j].key) TR[k]=SR[i++]; else TR[k]=SR[j++]; if(i<=m) for(l=0;l<=m-i;l++) TR[k+l]=SR[i+l]; /* 将剩余的SR[i..m]复制到TR */ if(j<=n) for(l=0;l<=n-j;l++) TR[k+l]=SR[j+l]; /* 将剩余的SR[j..n]复制到TR */ }
将SR[s..t]归并排序为TR1[s..t]。
void MSort(RedType SR[],RedType TR1[],int s, int t) { /* 将SR[s..t]归并排序为TR1[s..t]。*/ int m; RedType TR2[MAXSIZE+1]; if(s==t) TR1[s]=SR[s]; else { m=(s+t)/2; /* 将SR[s..t]平分为SR[s..m]和SR[m+1..t] */ MSort(SR,TR2,s,m); /* 递归地将SR[s..m]归并为有序的TR2[s..m] */ MSort(SR,TR2,m+1,t); /* 递归地将SR[m+1..t]归并为有序的TR2[m+1..t] */ Merge(TR2,TR1,s,m,t); /* 将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t] */ } }
对顺序表L作归并排序。
void MergeSort(SqList *L) { /* 对顺序表L作归并排序。 */ MSort((*L).r,(*L).r,1,(*L).length); }
C++可执行代码:
#include<iostream> using namespace std; void merge(int a[],int b[],int low,int m,int high) { int i=low,j=m+1; int k=low; for(;i<=m&&j<=high;) { if(a[i]<=a[j]) { b[k]=a[i]; k++;i++; } else { b[k]=a[j]; k++; j++; } } if(i<=m) { for(int l=0;l<=m-i;l++) b[k++]=a[i+l]; } if(j<=high) { for(int l=0;l<=high-j;l++) b[k++]=a[j+l]; }
// 此处错误, 需要将B拷入A
} void mergesort(int a[],int b[],int low,int high) { if(low==high) b[low]=a[low]; else { int m=(low+high)/2; mergesort(a,b,low,m); mergesort(a,b,m+1,high); merge(a,b,low,m,high); } } int main() { int a[20];int b[20]; int n; while(cin>>n) { for(int i=0;i<n;i++) cin>>a[i]; mergesort(a,b,0,n-1); for(int i=0;i<n;i++) cout<<b[i]<<' '; cout<<endl; } return 0; }