基数排序

按照不同数位排序,数列绝对顺序改变但相对顺序不变。例如,对于十位排序后,对于十位相同的数,个位大小仍是有序排列。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int map[10][5],b[120],a[120],n,step,m;
void Counting_Sort(int deep)
{
    if(deep>step) return;
    memset(b,0,sizeof(b));
    int p;
    for(int i=1;i<=n;i++)
    {
        p=a[i];
        for(int j=1;j<deep;j++) p/=10;
        p%=10;
        b[p]++;
        map[p][b[p]]=a[i];
    }
    int x=0;
    for(int i=0;i<=9;i++)
    {
        for(int j=1;j<=b[i];j++)
        {
            a[++x]=map[i][j];
        }
    }
    Counting_Sort(deep+1);
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        m=max(m,a[i]);
    }
    step=log10(m)+1;
    Counting_Sort(1);
    for(int i=1;i<=n;i++)
    {
        printf("%d ",a[i]);
    }
}

 

posted @ 2019-08-05 09:13  satans  阅读(135)  评论(0编辑  收藏  举报