Ka的分治|归并排序,注释详尽

 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 }
原文地址:https://www.cnblogs.com/KakagouLT/p/4702716.html