八、基数排序(Radix Sort)

  基数排序原理类似于桶排序。

  假设要对10个在0~999范围内的数排序。一般来说,这是在0~bp-1范围内的N个数,b是基底,p是某个常数 。显然不能使用桶排序,这样使用的桶太多了。诀窍在于使用几趟桶式排序。比较简单的做法是从最低有效位开始(LSD)。

  以b=10为例,这里只需要10个桶,多次使用。

  先从个位数开始进行桶排序,可能不止一个数落到同一个桶里,把落到同一个桶里的数放到一个表里。每一趟都是稳定的:例如,进行了个位数的排序后,顺序取出,再按十位数装桶时,若十位数相等的话,个位数是按从小到大的顺序入桶的,即入完桶还是有序的

 步骤:

  1)以个位数的值进行装桶;

  2)将桶里的数字顺序取出来;

  3)以十位数的值进行装桶;

  4)顺序取出,再按百位......进行装桶。

eg.

  数组{362,214,259,88,116,234}

       排序算法——基数排序       排序算法——基数排序        排序算法——基数排序  

 (从左至右依次是按个、十、百位数进行装桶的结果)

       按个位数排序后,顺序取出{362,214,234,116,88,259};

  按十位数排序后,顺序取出{214,116,234,259,362,88};

  按百位数排序后,顺序取出{88,116,214,234,259,362};

  排序完成。

计算数组中数值的最大位数:

/**
* 计算输入数据中值的最大位数
*/
int maxBit(vector<int> &a)
{
    int bit = 0;
    for (int i = 0; i < a.size(); i++)
    {
        int p = a[i];
        int c = 1;
        while (p / 10)
        {
            p = p / 10;
            c++;
        }
        if (c > bit)
            bit = c;
    }
    return bit;
}
View Code

相关文章: