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 }
  • 相关阅读:
    字符串算法总结
    [HAOI2007]反素数
    Poj2689 Prime Distance
    [APIO2010]特别行动队
    [国家集训队]middle
    Typecho博客迁移实战
    Typora + 七牛云图床 简易配置
    教你用快捷键 以管理员身份运行cmd
    Typecho博客插入B站视频
    七牛云图床快捷上传方法
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/4702716.html
Copyright © 2011-2022 走看看