蓝桥杯算法基础(16):十大排序算法(计数排序)(基数排序)c语言版- 基数排序

时间:2024-03-19 18:29:00
      
      举例:
        154 423 365 251 78 92 640

--------------------------------------

(第一轮)(10的0次方 位即个位)640 251 92 423 154 365 78
(第二轮)(10的1次方 位即十位)423 640 251 154 365 78 92
(第三轮)(10的2次方 位即百位)78  92 154 251 365 423 640
      //基数排序需要用到桶
      [][][][][][][][][][]
      [][][][][][][][][][]
      [][][][][][][][][][]
      [][][][][][][][][][]
      [][][][][][][][][][]
      [][][][][][][][][][]
      [][][][][][][][][][]
      0 1 2 3 4 5 6 7 8 9
      int temp[10][N];
        //先从个位开始选择放入桶中,随后从十位,百位...依次放入桶内
      void redixSort(int arr[],int length){
        int i;
        int j;
       //将对应数的放入对应的桶内,再丢回原来的数组中,就进行了一次排序
       for(int k=10;k<10000;k*=10){
            for(int i=0;i<length;i++){
                int j=0;
                int pos=(arr[i]%k)/(k/10);
                while(temp[pos][j])
                j++;//找到该通内无元素的位置;
                temp[pos][j]=arr[i];//将arr[i]放入没有元素的位置

            }
            pos=0;
            for(i=0;i<10;i++){//因为有10个桶
                for(j=0;j<length&&temp[i][j]!=0,j++){            
                        arr[pos++]=temp[i][j];
                        temp[i][j]=0;//数值拿到原数组后,将桶还原为0
                    //若等于0,则后面没有元素,直接退出
                }
            }
       }
      }
//定义10个桶 从0到9
//根据数从位数开始,从小到大放入十个桶中,位数也从低到高,将所有位数都遍历过之后,就已经排序好了