归并排序的递归和迭代写法

 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一次。

posted @ 2019-12-19 10:02  念秋  阅读(532)  评论(0编辑  收藏  举报