zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    读取STL模型 并用opengl显示
    金币阵列问题
    字典序问题的解决方案
    opengl中的旋转与平移
    copy文件夹,通过C++读取系统、用户名以及计算机名的方法
    poj3032
    菲涅尔反射(Fresnel Reflection)
    几个稍大场景的渲染测试
    Ward BRDF实现心得
    离线渲染中的不规则光源(Meshlight)
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/4702716.html
Copyright © 2011-2022 走看看