基数排序

来源:互联网 发布:ubuntu syslog函数 编辑:程序博客网 时间:2024/06/06 02:00
基数排序的排序趟数取决于待排序列中最大值的位数。

     //  arr  465   3  获得最大数的位数
        int FindMaxFinger(int arr[], int len)
       {
           int max = arr[0];
           for (int i = 1; i < len; ++i)
          {
              if (arr[i] > max)
                  max = arr[i];
          }
          int count = 0;
          while (max != 0)
         {
              max = max / 10;
              count++;
          }
         return count;
       }

       //获得每个数据 位的数 (45 0) 5  (45 1) 4
      //num/pow(10.0,fin)%10
        int FindFingerNumber(int num, int fin)
       {
           return num / (int)pow(10.0,fin) % 10;
       }

      //0 ,1,2(个,十,百) 且0可以参与排序
        void Radix1(int arr[], int len, int fin)
       {
           int tmp[10][N] = {};
           int num_fin;
           int count[10] = {};
           for (int i = 0; i < len; ++i)
         { 
            num_fin = FindFingerNumber(arr[i], fin);
            tmp[num_fin][count[num_fin]] = arr[i];
            count[num_fin]++;
         }
          int index = 0;
          for (int i = 0; i < 10; ++i)
         {
              for (int j = 0; j < count[i]; ++j)
                 arr[index++] = tmp[i][j];
          }
       }


       //每趟循环调用Radix()
       void RadixSort(int arr[], int len)
      {
            int maxFinNum = FindMaxFinger(arr, len);
           for (int i = 0; i < maxFinNum; ++i)
              Radix1(arr, len, i);
      }