代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,a[maxn],b[maxn],cnt[10],mx;
void read_and_parse(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),mx=max(mx,a[i]);
}
void solve(){
int pos=1;
while(pos<=mx){
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++)++cnt[a[i]/pos%10];//按位计数
for(int i=1;i<10;i++)cnt[i]+=cnt[i-1];//找出右边界
for(int i=n;i>=1;i--)b[cnt[a[i]/pos%10]--]=a[i];//倒序遍历装桶
for(int i=1;i<=n;i++)a[i]=b[i];//完成按照当前位排序
pos*=10;//位数加一
}
for(int i=1;i<=n;i++)printf("%d%c",a[i],i==n?'
':' ');
}
int main(){
read_and_parse();
solve();
return 0;
}