算法描述
- 字符串长度为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];
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];
}
}
}
算法分析
- 基于R个字符字母表的N个长W字符串为键的元素,LSD需要访问7WN+3WR次数组,额外空间和N+R成正比
证明:W轮键索引计数:初始化数组:N+W(R+1),循环:W(2N+2R+3N+2N),空间上由aux[N]和count[R+1]可得
- LSD算法是稳定的
证明:对于每一轮索引计数分别是稳定的,递推至W轮始终是稳定的