跳转至

基数排序

#include<bits/stdc++.h>
#define Maxn 1000000
using namespace std;
int a[Maxn+5],n;
vector<int> ans[2][15];
int pw(int x)
{
    int ans=1;
    while(x--) ans*=10;
    return ans;
}
void numsort(int len)
{
    for(int i=0;i<len;i++)
    {
        for(int j=0;j<10;j++) ans[(i&1)^1][j].clear();
        for(int j=0;j<10;j++)
        {
            for(int k=0;k<ans[i&1][j].size();k++)
            {
                int tmp=ans[i&1][j][k];
                ans[(i&1)^1][a[tmp]/pw(i)%10].push_back(tmp);
            }
        }
    }
}
int main()
{
    scanf("%d",&n);
    int mx=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",a+i);
        int tmp=a[i],cnt=0;
        while(tmp)
        {
            tmp/=10;
            cnt++;
        }
        mx=max(mx,cnt);
        ans[0][0].push_back(i);
    }
    numsort(mx);
    for(int i=0;i<10;i++)
    {
        for(int j=0;j<ans[mx&1][i].size();j++)
        {
            printf("%d ",a[ans[mx&1][i][j]]);
        }
    }
    return 0;
}