时间复杂度
最好:O(nlogn)
最差:O(nlogn)
平均:O(nlogn)
空间复杂度
非原地排序:O(n)
算法稳定性:稳定
#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
constexpr int N=1e5+7;
int n,a[N];
int get(int t,int w){
int tmp=t/pow(10,w);
return tmp%10;
}
void so(int w){
int maxx=0,pre[N]={},ans[N]={};
for(int i=1;i<=n;i++){
maxx=max(get(a[i],w),maxx);
pre[get(a[i],w)]++;
}
for(int i=1;i<=maxx;i++) pre[i]+=pre[i-1];
for(int i=n;i>=1;i--){
ans[pre[get(a[i],w)]--]=a[i];
}
for(int i=1;i<=n;i++){
a[i]=ans[i];
}
}
void Sort(){
int maxx=0;
for(int i=1;i<=n;i++) maxx=max(maxx,a[i]);
maxx*=10;
for(int i=0;maxx>=pow(10,i);i++){
so(i);
}
}
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
Sort();
for(int i=1;i<=n;i++){
printf("%d ",a[i]);
}
return 0;
}