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 }
时间: 2024-09-15 11:14:47