基数排序
还是有点东西的
说白了基数排序就是从地位开始比较,如果当前位没有就是0
有个技巧需要注意代码里说了
代码
#include<bits/stdc++.h>
using namespace std;
int a[100];
int n,ma;
void st1(int cur){
int b[10]={0};
int c[100];
for(int i=0;i<n;i++)
b[(a[i]/cur)%10]++;
for(int i=1;i<10;i++)
b[i]+=b[i-1];
//下面这个地方尤为关键为啥从n-1开始,而不是0开始
// 因为是从最低为开始的,前面已经在地位排好了,如果从0开始
// 如果当前位两个数字为0,那么他们的相对位置应该不变
// 0开始就反了,顺序错了。
for(int i=n-1;i>=0;i--)
{
//精髓所在
c[b[(a[i]/cur)%10]-1]=a[i];
b[(a[i]/cur)%10]--;
}
for(int i=0;i<n;i++)
a[i]=c[i];
}
void st2(){
for(int i=1;ma/i>0;i*=10)
st1(i);
}
int main(){
while(cin>>n){
ma=0;
for(int i=0;i<n;i++){
cin>>a[i]; ma=max(a[i],ma);
}
puts("before sort");
for(int i=0;i<n;i++)
cout<<a[i]<<' ';
puts("");
st2();
puts("after sort");
for(int i=0;i<n;i++)
cout<<a[i]<<' ';
puts("");
}
return 0;
}