• 基数排序[算法]


    算法名称:基数排序[MSD最高位优先]

    作者:Robert


    基本思路:利用每个元素的本身自带的信息,优先比较位数靠后的大小,直到比较整个位数。


    实现步骤:设置比较的几个梯度[通常是10进制],先按最低的[个位]进行排序后顺序链接,然后把处理过后的按第二位比较[十位]进行排序,以此类推即可将所有数字排序。


    模板

     

     1 inline int maxbit(int a[]){
     2     int p=10,d=1;
     3     for(int i=0;i<n;i++)
     4         while(a[i]<=p) p*=10,d++;
     5     return d;
     6 }
     7 
     8 int d=maxbit(a);
     9 for(int k=1,p=1;k<=d;k++,p*=10){
    10     for(int i=0;i<10;i++) c[i]=0;
    11     for(int i=0;i<n;i++) c[(a[i]/p)%10]++;
    12     for(int i=1;i<=10;i++) c[i]+=c[i-1];
    13     for(int i=n-1;i>=0;i--) t[--c[(a[i]/p)%10]]=a[i];
    14     for(int i=0;i<n;i++) a[i]=t[i];
    15 }
    View Code

     


    正确性:因为第一次使得个位大小从小到大,然后在保证个位从小到大的时候将十位数排序,这样就使得如果只看后两位数,十位数相同的数会依据个位数的大小自动的分好。以此类推,就满足从高位到低位都是有序的,并优先高位【表现在逆过程中】。


    时空复杂度:大概是O(n*d),但是因为运用除法所以常数大一些。


    主要用途:

    1.基数排序是稳定的排序,同时也是稳定排序中比较快的,可以用于要求稳定排序的排序题中。

    2.后缀数组的后缀排序可以使用以ASC码为进制的基数排序

  • 相关阅读:
    仿美团pc,koa+ssr(四)
    基本的数据库操作脚本
    jQuery选择器总结
    经常学习参考网站
    WebAPI
    Sqlserver 基本面试题
    truncate和delete的区别
    Webservice,WCF,WebAPI 之间的区别
    WCF 学习
    学习angularJs(1)--引用文件
  • 原文地址:https://www.cnblogs.com/Robert-Yuan/p/5033750.html
Copyright © 2020-2023  润新知