1 #include<iostream>
2 #include<cstdlib>
3 #include<climits>
4 using namespace std;
5
6 /*
7 函数名:Merge
8 功能: 合并有序子序列a[low..mid],a[mid+1..high]为一个有序序列
9 */
10 void Merge(int a[],int low,int mid,int high){
11 int sub1_len=mid-low+1; // 计算子序列1的长度
12 int sub2_len=high-mid; // 计算子序列2的长度
13 int *L=NULL,*R=NULL;
14 L = (int *)malloc(sizeof(int)*(sub1_len+1));//L和R为暂存序列,分别保存待排序的左右子序列
15 R = (int *)malloc(sizeof(int)*(sub2_len+1));
16 for(int i=0;i<sub1_len;++i){ //分别将子序列复制到L和R
17 L[i]=a[low+i]; //从low开始
18 }
19 for(int j=0;j<sub2_len;++j){
20 R[j]=a[mid+1+j]; //从mid+1开始
21 }
22 L[sub1_len]=1000; //1000为哨兵,可设为待排序的数据域的最大值
23 R[sub2_len]=1000; //如果不设置哨兵,下面还需判断L、R是否为空
24 int i=0;
25 int j=0;
26 for(int k=low;k<=high;++k){ //将两个已排序子序列元素的较小的元素依次放入排序序列
27 if(L[i]<=R[j]){
28 a[k]=L[i++];
29 }
30 else {
31 a[k]=R[j++];
32 }
33 }
34 }
35 void Merge1(int a[],int low,int mid,int high){
36 int sub1_len=mid-low+1;
37 int sub2_len=high-mid;
38 int *L=NULL,*R=NULL;
39 L = (int *)malloc(sizeof(int)*(sub1_len));
40 R = (int *)malloc(sizeof(int)*(sub2_len));
41 for(int i=0;i<=sub1_len-1;++i){
42 L[i]=a[low+i];
43 }
44 for(int j=0;j<=sub2_len-1;++j){
45 R[j]=a[mid+1+j];
46 }
47 int i= 0;
48 int j =0;
49 int k= low;
50 while(i<sub1_len&&j<sub2_len){ //注意这里的循环条件,不是k<=high!!!
51 if(L[i]<=R[j])
52 a[k++] = L[i++];
53 else
54 a[k++] = R[j++];
55
56 }
57 while(i<sub1_len)
58 a[k++]= L[i++];
59 while(j<sub2_len)
60 a[k++]= R[j++];
61
62 }
63 /*
64 函数名:Mergesort
65 功能: 排序序列a的low至high段
66 方式: 递归
67 */
68 void Mergesort(int a[],int low,int high){
69 int mid;
70 if(low<high){
71 mid=int((low+high)/2);
72 Mergesort(a,low,mid);
73 Mergesort(a,mid+1,high);
74 Merge1(a,low,mid,high);
75 }
76 }
77
78 int main(){
79 int num;
80 while(1){
81 cin>>num;
82 int *array=NULL;
83 array = (int *)malloc(sizeof(int)*(num));
84
85 for(int i=0;i<num;i++) cin>>array[i];
86
87 Mergesort(array,0,num-1);
88
89
90 for(int i=0;i<num;i++) cout<<array[i]<<" ";
91 }
92 return 0;
93 }