【模板】基数排序

代码如下

#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?'\n':' ');
}

int main(){
    read_and_parse();
    solve();
    return 0;
}
posted @ 2019-01-02 21:00  shellpicker  阅读(120)  评论(0编辑  收藏  举报