关于归并排序(模板)

嗯...

归并排序这个东西,主要用了分治的思想,并且有一点递归的意思...

详细看代码...

 1 #include<cstdio>
 2 using namespace std;
 3 int n,z[233],y[233];
 4 
 5 void merge_sort(int l,int r)//归并排序,用到了分治的思想,两个参数分别为左端点和右端点 
 6 {
 7     if (l==r) return;//l==r则它是空的 
 8     int m=(l+r)/2;//进行分治,m为它的中点 
 9     merge_sort(l,m);//将从第一个到m再进行归并排序 
10     merge_sort(m+1,r);//将从m+1个到r再进行归并排序
11     //注意直到分治成每一块只有一个数据为止,一个类似递归的思想 
12     int p1=l,p2=m+1;//将第一大块的第一个数定义为p1,第二大块的第一个数定义为p2,相当于指针 
13     for (int a=l;a<=r;a++)//将所有数据进行循环搜索 
14     {
15         if (p1 > m) //如果p1超出了第一块的范围 
16         {
17             y[a] = z[p2];//那么就将p2位置的数放入y数组 
18             p2 ++;//p2指针后移 
19         }
20         else if (p2 > r)//如果p2超出了第二块的范围 
21         {
22             y[a] = z[p1];//那么就将p1位置的数放入y数组 
23             p1++;//p1指针后移 
24         }
25         else if (z[p1] < z[p2])//如果除了上述情况且p1位置的数比p2位置的数小 
26         {
27             y[a] = z[p1];//则将p1位置的数放入y数组 
28             p1++;//p1指针后移 
29         }
30         else//最后一种情况只需要用else即可 
31         {
32             y[a] = z[p2];//p2位置的数放入y数组
33             p2 ++;//p2指针后移 
34         }
35     }
36     for (int a=l;a<=r;a++)
37         z[a]=y[a];//将z数组更新,将排好序的序列放入z数组 
38 }
39 
40 int main()
41 {
42     //主函数进行读入、调用、输出
43     scanf("%d",&n);
44     for (int a=1;a<=n;a++)
45         scanf("%d",&z[a]);
46     merge_sort(1,n);
47     for (int a=1;a<=n;a++)
48         printf("%d
",z[a]);
49 }

相信能看懂....

原文地址:https://www.cnblogs.com/New-ljx/p/10363132.html