十大排序算法-------【基數排序】詳解(Java源碼)

基數排序是按照低位先排序,然後收集;再按照高位排序,然後再次收集;依次類推,直到最高位。有時候有些屬性是有優先級順序,先按照低優先級排序,再按照高優先級排序。最後的次序就是高優先級的在前,高優先級相同的低優先級高的在前。

  1. 算法描述:
    1. 取得數組中的最大數,並取得位數;
    2. Arrays爲原始數組,從低位開始取到每個位組成radix數組;
    3. 對redix進行計數排序(利用計數排序適用於小範圍數的特點)
  2. https://images2017.cnblogs.com/blog/849589/201710/849589-20171015232453668-1397662527.gif
  3. 代碼
private static void jiShu(int[] arrays) {

        // 先按照基數排序,也就是個位上數值大小

        int[][] arrayss = new int[10][];

        for (int i = 0; i < arrays.length; i++) {

               String s = String.valueOf(arrays[i]);

               int ge = Integer.parseInt(s.substring(s.length() - 1, s.length()));



               if (arrayss[ge] == null) {

                      arrayss[ge] = new int[1];

                      arrayss[ge][0] = arrays[i];

               } else {

                      int[] temp = new int[arrayss[ge].length + 1];

                      zhuanyiShuZu(arrayss[ge], temp);

                      temp[arrayss[ge].length] = arrays[i];

                      arrayss[ge] = temp;

               }

        }



        // 將二維數組轉換爲一維數組

        for (int i = 0, a = 0; i < arrayss.length; i++) {

               if (arrayss[i] != null) {



                      for (int j = 0; j < arrayss[i].length; j++) {

                             arrays[a++] = arrayss[i][j];

                      }

               }

        }



        // 按照最高位大小排序

         arrayss = new int[10][];



        for (int i = 0; i < arrays.length; i++) {

               String s = String.valueOf(arrays[i]);

               int gao = Integer.parseInt(s.substring(0, 1));



               if (arrayss[gao] == null) {

                      arrayss[gao] = new int[1];

                      arrayss[gao][0] = arrays[i];

               } else {

                      int[] temp = new int[arrayss[gao].length + 1];

                      zhuanyiShuZu(arrayss[gao], temp);

                      temp[arrayss[gao].length] = arrays[i];

                      arrayss[gao] = temp;

               }

        }



        // 將二維數組轉換爲一維數組

        for (int i = 0, a = 0; i < arrayss.length; i++) {

               if (arrayss[i] != null) {

                      for (int j = 0; j < arrayss[i].length; j++) {

                             arrays[a++] = arrayss[i][j];

                      }

               }

        }

}



private static void zhuanyiShuZu(int[] arrays1, int[] arrays2) {

        for (int i = 0; i < arrays1.length; i++) {

               arrays2[i] = arrays1[i];

        }

}
  1. 基數排序是基於分別排序,分別收集,所以是穩定的,但是基數排序的性能要比桶排序要略差,每一次關鍵字的桶分配都需要O(n)的時間複雜度,而且分配之後得到的新的關鍵字序列又需要O(n)的使勁複雜度。假如待排序數據可以分爲d個關鍵字,則基數排序的時間複雜度將是O(d*2n),當然基本上還是線性級別的。基數排序的空間複雜度爲O(n+k),其中k爲桶的數量。一般來說n>>k,因此額外空間還是需要大概n個。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章