以{53,542,003,063,014,214,154,748,616}为例:
看下面的图:
首先将所有待比较的数变为为统一位数长度,接着从最低位开始,依次进行排序。
1. 按照个位数进行排序。
2. 按照十位数进行排序。
3. 按照百位数进行排序。
那如何进行排序呢?sort?
不要,只需要用桶就可以了。
只需要将数字储存在桶里,进行一个类似于桶排的操作就可以了。
以个位为例子,053的个位为3,所以f[3]=053,以此类推。
很简单的是吧。
接下来直接上代码了:
#include<cstdlib>
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
long long a[100001],n,b[10][100001],bj[100];
long long len_max() {//要循环几次
long long ans=0,l=0;
for(long long i=1; i<=n; i++) {
l=0;
scanf("%lld",&a[i]);
long long hhh=a[i];
while(hhh>=1) {
hhh/=10;
l++;
}
if(l>ans)
ans=l;
}
return ans;//返回最大的数字长度
}
void print(){
for(long long i=1;i<=n;i++)
printf("%lld ",a[i]);//输出
}
void sort(){
long long d=1,k,ans=0,p=len_max();
for(long long j=1;j<=p;j++){//循环p次
ans=0;
memset(b,0,sizeof(b));//将数字清零十分重要
for(long long i=1;i<=n;i++){
k=(a[i]/d)%10;//求出位数上的值
bj[k]++;
b[k][bj[k]]=a[i];//桶操作
}
for(long long i=0;i<10;i++){
int o=bj[i];
while(bj[i]){
ans++;
a[ans]=b[i][o-bj[i]+1];//将桶的值赋给原数组
bj[i]--;
}
}
d*=10;//位数+1
}
}
int main() {
scanf("%lld",&n);
sort();
print();
}