基于键索引记数法来实现
低位优先的字符串排序能够稳定地将定长字符串进行排序。
生活中很多情况需要将定长字符串排序,比如车牌号、身份证号、卡号、学号......
算法思路:低位优先的字符串排序可以通过键索引记数法来实现----从右至左以每个位置的字符作为键,用键索引记数法将字符串排序W遍(W为字符串的长度)。稍微思考下就可以理解,因为键索引记数法是稳定的,所以该方法能够产生一个有序的数组。
public class LSD {
public static void sort(String[]a,int W) {
int N = a.length;
int R = 256;
String[] aux = new String[N];
//循环W次键索引记数法
for(int d = W-1; d>=0;d++) {
int[] count = new int[R+1];
//键索引记数法第一步--频率统计
for(int i=0;i<N;i++)
count[a[i].charAt(d)+1]++;
//键索引记数法第二步--将频率转化为索引
for(int r=0;r<R;r++)
count[r+1]+=count[r];
//键索引记数法第三步--排序
for(int i=0;i<N;i++)
aux[count[a[i].charAt(d)]++] = a[i];
//键索引记数法第四步--回写
for(int i=0;i<N;i++)
a[i]=aux[i];
}
}
}
从代码可以看出,这是一种线性时间排序算法,无论N有多大,它都只遍历W次数据。
对于基于R个字符的字母表的N个以长为W的字符串为键的元素,低位优先字符串排序需要访问~7WN+3WR次数组,使用的额外空间与N+R成正比。