口诀:清桶入桶计基,倒排乘基循环。

void RadixSort(int a[],int n)
{
    int i,j,k=0;    //编号序号
    int count[10];    //桶数
    int temp[n];    //临时存储数组
    int d=maxbit(a,n);    //获取最多有多少位数
    int radix=1;    //基数

    for(j=1;j<=d;j++)
    {
        for(i=0;i<10;i++)    count[i]++;    //清桶
        for(i=0;i<n;i++)                          //入桶   
        {
            k=a[i]/radix%10;
            count[k]++;
        }
        for(i=1;i<10;i++)    count[i]+=count[i-1];    //计基,注意从1开始
        for(i=n-1;i>=0;i--)    //倒排,因为入桶的顺序是从0-n;出桶时应该是相反的顺序
        {
                k=a[i]/radix%10;   
                temp[--count[k]]=a[i];
        }
        for(i=0;i<n;i++)    a[i]=temp[i];    //排序,将临时数组中的内容取出
        radix*=10;                                    //乘基
    }                                                      //循环
}    


int maxbit(int a[],int n)
{
    int d=1;
    int radix=10;
    for(int i=0;i<n;i++)
    {
          while(a[i]>=p)
          {
                 p*=10;
                 ++d;
          }
     }
      return d;
    

  

posted on 2019-04-21 17:10  tobyte  阅读(211)  评论(0编辑  收藏  举报