低位优先的字符串排序会从后往前比较各个字符串的当前位字符大小
void LSDsort(std::string *a, int w)
{
int n = a->size()+1; //数组长度,即字符串个数
//printf("%d", n);
const int r = 256;
std::string *aux;
aux = new std::string[n];
for (int d = w - 1; d >= 0; d--)
{
int count[r + 1] = {};
for (int i = 0; i < n; i++) //计算出现频率
{
//printf("%d ", a[i][d]);
count[a[i][d]]++;
}
count[0] = -1;
for (int i = 0; i < r; i++) //频率变排名(rank)
{
count[i+1] += count[i];
//printf("%d %d\n",i+1, count[i + 1]);
}
//printf("\n");
for (int i = 0; i < n; i++) //元素分类
{
//printf("loop:%d char:%d rank:%d\n", i,a[i][d], count[a[i][d]-1]+1);
aux[count[a[i][d]-1]+1] = a[i];
count[a[i][d]-1]++;
}
for (int i = 0; i < n; i++) //回写
{
a[i] = aux[i];
}
}
}
运行结果:
P.S.黄色部分为输入
低位优先的字符排序很简单,缺点也很明显:慢,并且不具备稳定性
下次我们会讨论更快更稳定的高位优先和三向的字符排序