1 #include <stdio.h>
2 int GBsort(int *A,int x,int y,int *B)
3 //A是待排列的数组,数组为[x,y),B是备份数组
4 {
5 if(y-x>1) //考虑数组不是单独一个元素的情况
6 {
7 int h=x+(y-x)/2;//h=中间点 赋值等价于(x+y)/2
8 int lm=x,rm=h;//rm=右边待排序标号 lm=左边待排序标号 应用见18行
9 int i=x;//i=备份数组标号,应用见25行
10
11 //接下来先将中间点两旁的数组分别排序好
12 //使用递归
13 GBsort(A,x,h,B);
14 GBsort(A,h,y,B);
15
16 //现在比较两部分的最小数
17 //小的放入备份数组,大的继续等待比较
18 while(lm<h||rm<y)//当待排序标号都在自己的范围内时
19 {
20 //右边的数已用完则直接把左边的数放入B中
21 //如果右边没用完,看看左边的数是否没用完而且小于右边的数
22 //再把左边的数放入B
23 if(rm>=y||(lm<h&&A[lm]<=A[rm]))//
24 B[i++]=A[lm++];//放数后顺便移位
25 else B[i++]=A[rm++]; //此外的情况就自然是右边小于左边了
26 }
27 //到这里,处理就结束了,两个部分结合成一个有序的部分
28 //但是数据还在备份数组,所以要把备份数组的数据放回原数组
29 for(i=x;i<y;i++)
30 A[i]=B[i];
31 }
32 //只有一个元素时必然是有序的,不用再排序了
33 }
34 int main()
35 {
36 int t[100],a[100],i,n;
37 scanf("%d",&n);
38 for(i=0;i<n;i++)
39 scanf("%d",&a[i]);
40 GBsort(a,0,n,t);
41 for(i=0;i<n;i++)
42 printf("%d ",a[i]);
43 return 0;
44 }