基数排序[算法]

算法名称:基数排序[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码为进制的基数排序

原文地址:https://www.cnblogs.com/Robert-Yuan/p/5033750.html