1 void hebing(int a[],int l,int mid,int h)
2 {
3 int i,x[100];
4 int j,y[100]; //将要合并的两部分存放在两个数组中
5 int n1 = mid-l+1;//因为下面定义的时候是i = 1,j = 1;
6 int n2 = h-mid;
7 for( i=1;i<=n1;i++)
8 {
9 x[i] = a[l+i-1];//a是从1开始的,且此处包含了mid
10 }
11 for( i=1;i<=n2 ;i++)
12 {
13 y[i] = a[mid+i];
14 }
15 i= 1,j = 1;
16 int k=l;//a是从0开始的X!!!如果a是从一开始的那么调用的时候填1和n就可以
17 while(i<=n1 && j<=n2) //此时进行归并
18 {
19 if(x[i]<y[j])
20 a[k++] = x[i++];
21 else
22 a[k++] = y[j++];
23 }
24 while(i<=n1)
25 a[k++] = x[i++];
26 while(j<=n2)
27 a[k++] = y[j++];
28
29 }
30 void chaifen(int a[],int l,int h) //此处的递归是通过调用自己本身实现的,注意递归的含义不只是需要靠返回值实现,只要一层层调用函数运行函数即可
31 {
32 int mid;
33 if(l<h)
34 {
35 mid = (l+h)/2;
36 chaifen(a,l,mid);//必须 有一个包含mid
37 chaifen(a,mid+1,h);
38 hebing(a,l,mid,h); //他的排序是在合并的时候通过递归一层层的派的
39 }
40 }
41 void main()
42 {
43 int n,a[100],i;
44 scanf("%d",&n);
45 for(i = 0;i < n;i++)
46 {
47 scanf("%d",&a[i]);
48 }
49 printf("yes\n");
50 chaifen(a,0,n-1);
51
52 for(i=0;i<n;i++)
53 {
54 printf("%d ",a[i]);
55 }
56 }