算法说明
适用于数的值较小且集中的情况。
(1)初始化当前数位为最低位
(2)遍历一遍数组a,将当前数位值为i的数插入桶t[i]中
(3)从桶0到桶9依此遍历所有桶,将数值依此存入a数组中(覆盖原数组)
(4)如果当前数位是最高位,退出;否则,当前数位升高一位,转(2)
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=110;
int a[maxn];//原数组
vector<int> t[10];//10个桶
void LSD(int N)
{
int maxv=-1e9;
for(int i=0;i<N;i++) maxv=max(maxv,a[i]);
int radix=1;//取哪一位
while(maxv)
{
maxv/=10;
for(int i=0;i<10;i++) t[i].clear();
for(int i=0;i<N;i++)
{
int tmp=a[i]/radix;
tmp%=10;
t[tmp].push_back(a[i]);
}
int cnt=0;
for(int i=0;i<10;i++)
{
for(int j=0;j<t[i].size();j++)
a[cnt++]=t[i][j];
}
radix*=10;
}
}
int main()
{
int N;
while(cin>>N)
{
for(int i=0;i<N;i++) cin>>a[i];
LSD(N);
for(int i=0;i<N;i++) cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}