十大排序算法-------【基数排序】详解(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个。
posted @ 2019-03-17 14:37  CHANGEMAX  阅读(168)  评论(0编辑  收藏  举报