1 #include<iostream> 2 using namespace std; 3 int n; 4 void print(int *a) 5 { 6 for(int i=0;i<n;i++) 7 { 8 cout<<a[i]<<" "; 9 } 10 cout<<endl; 11 } 12 void merge(int *a,int *t,int begin,int mid,int end) 13 { 14 int xb=begin; 15 int b=begin; 16 int e=mid+1; 17 while(b<=mid&&e<=end) 18 { 19 if(a[b]<=a[e]) 20 { 21 t[xb++]=a[b++]; 22 } 23 else 24 { 25 t[xb++]=a[e++]; 26 } 27 }/* 总有一边先录完,剩下一边还有,所以还要继续录入*/ 28 while(b<=mid) 29 { 30 t[xb++]=a[b++]; 31 } 32 while(e<=end) 33 { 34 t[xb++]=a[e++]; 35 } 36 /* 最后一步*/ 37 for(int i=begin;i<=end;i++) 38 { 39 a[i]=t[i]; 40 } 41 } 42 void msort(int *a,int *t,int begin,int end) 43 { 44 if(begin>=end) 45 { 46 return;/* 不符合规范,无法排序*/ 47 } 48 else 49 { 50 int mid=(begin+end)/2;/* 用mid把待排序数组分为两部分*/ 51 msort(a,t,begin,mid); 52 msort(a,t,mid+1,end); 53 merge(a,t,begin,mid,end);/* 排好序后合并即可*/ 54 } 55 } 56 void mergeSort(int *a)/* 封装一下*/ 57 { 58 int *t; 59 t=new int[n]; 60 msort(a,t,0,n-1); 61 free(t); 62 } 63 int main() 64 { 65 cout<<"下面请输入问题规模n\n"; 66 cin>>n; 67 int *a; 68 a=new int[n]; 69 cout<<"下面请输入n个数字\n"; 70 for(int i=0;i<n;i++) 71 { 72 cin>>a[i]; 73 } 74 mergeSort(a); 75 cout<<"下面是排序后的结果\n"; 76 print(a); 77 } 78 /* 79 16 80 11 33 0 -5 -4 3 45 222 111 -789 516 2 6 8 7 84 81 */
递归写法很容易嘛,有思路就好写,先把满足长度的数组序列分成两部分,两部分再一直递归调用即可,两部分都调用结束后,最后在合并就好了,合并用的merge函数,可以结合代码和注释仔细看看。
1 #include<iostream> 2 using namespace std; 3 int n; 4 void print(int *a) 5 { 6 for(int i=0;i<n;i++) 7 { 8 cout<<a[i]<<" "; 9 } 10 cout<<endl; 11 } 12 void merge(int *a,int *t,int begin,int mid,int end) 13 { 14 int xb=begin; 15 int b=begin; 16 int e=mid+1; 17 while(b<=mid&&e<=end) 18 { 19 if(a[b]<=a[e]) 20 { 21 t[xb++]=a[b++]; 22 } 23 else 24 { 25 t[xb++]=a[e++]; 26 } 27 }/* 总有一边先录完,剩下一边还有,所以还要继续录入*/ 28 while(b<=mid) 29 { 30 t[xb++]=a[b++]; 31 } 32 while(e<=end) 33 { 34 t[xb++]=a[e++]; 35 } 36 /* 最后一步*/ 37 for(int i=begin;i<=end;i++) 38 { 39 a[i]=t[i]; 40 } 41 } 42 void msort(int *a,int *t) 43 { 44 int s=1; 45 int times=1; 46 int i; 47 while(s<n) 48 { 49 i=0; 50 for(i=0;i+2*s<n;i=i+2*s)/* 两层循环,每次对长度为2*s的序列排序,然后用merge录入原数组*/ 51 { 52 int mid=(i+i+2*s-1)/2; 53 merge(a,t,i,mid,i+2*s-1); 54 } 55 int mid=(i+n-1)/2; 56 merge(a,t,i,mid,n-1); 57 s*=2; 58 times++; 59 } 60 merge(a,t,0,s/2-1,n-1); 61 } 62 void mergeSort(int *a) 63 { 64 int *t; 65 t=new int[n]; 66 msort(a,t); 67 free(t); 68 } 69 int main() 70 { 71 cout<<"下面请输入问题规模n\n"; 72 cin>>n; 73 int *a; 74 a=new int[n]; 75 cout<<"下面请输入n个数字\n"; 76 for(int i=0;i<n;i++) 77 { 78 cin>>a[i]; 79 } 80 mergeSort(a); 81 cout<<"下面是排序后的结果\n"; 82 print(a); 83 } 84 /* 85 19 86 11 33 0 -5 -4 3 45 222 111 -789 516 2 6 8 7 84 -28 -45 -456 87 */
这里是迭代写法,因为是迭代,所以用了两层循环,循环里面先使相邻2个有序,再使相邻4个有序。。。直到小于等于n的2的最大幂。考虑到n不一定正好是2的幂是,所以2层循环结束,最后再merge一次。