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

计数排序

算法思想: 统计原来数组的数据,讲数据转换成下标存储于一个临时的空间中,然后变量临时空间把对应的下标值放回原数组,当遍历临时空间完成后,原来的数组就排好序了
1 2 2 5 3 5 2 6 1 3 8

[0][1][2][3][4][5][6][7][8][9]
 0  2  3  2  0  2  1  0  1  0

 从小到大该下标位置的值有多少,就打印多少,遍历完成后,就排好序了
 1 1 2 2 2 3 3 5 5 6 8

 #define 100 N//偷个懒
 int temp[N];
 void countSort(int arr[],int length){
     for(int i=0;i<length;i+=){
     temp[arr[i]]++;
     }
     for(int i=0,j=0;iNN;i++){
         while(temp[i]--)arr[j++]=i;
     }
 }

 //计数排序是不稳定的排序,而且对于其中有一个非常大的数,会占用大量空间,比如1 2 5 2 999999,就需要temp[999999],因此如果计数排序适用于数值较小的数组

 基数排序

      
      举例:
        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
//根据数从位数开始,从小到大放入十个桶中,位数也从低到高,将所有位数都遍历过之后,就已经排序好了