1. 程式人生 > 資訊 >為推廣 Stadia 雲遊戲,谷歌將手柄和 Chromecast 組合出售:99.99 美元

為推廣 Stadia 雲遊戲,谷歌將手柄和 Chromecast 組合出售:99.99 美元

簡介
基數排序(radix sort)屬於“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為O (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。
圖解

程式碼

  public static void radixSort(int[] arr) {
    int[] nums = new int[10];
    int[][] bucket = new int[10][arr.length];
    int element;
    for (int j : arr) {
      element = j % 10;
      bucket[element][nums[element]] = j;
      nums[element]++;
    }
    int index = 0;
    for (int i = 0; i < nums.length; i++) {
      if (nums[i] != 0) {
       for (int j = 0; j < nums[i]; j++) {
         arr[index++] = bucket[i][j];
       }
      }
      nums[i] = 0;
    }
    System.out.println("第一輪======"+Arrays.toString(arr));

    for (int j : arr) {
      element = j /10 % 10;
      bucket[element][nums[element]] = j;
      nums[element]++;
    }
    index = 0;
    for (int i = 0; i < nums.length; i++) {
      if (nums[i] != 0) {
        for (int j = 0; j < nums[i]; j++) {
          arr[index++] = bucket[i][j];
        }
      }
      nums[i] = 0;
    }
    System.out.println("第二輪======"+Arrays.toString(arr));

    for (int j : arr) {
      element = j /100 % 10;
      bucket[element][nums[element]] = j;
      nums[element]++;
    }
    index = 0;
    for (int i = 0; i < nums.length; i++) {
      if (nums[i] != 0) {
        for (int j = 0; j < nums[i]; j++) {
          arr[index++] = bucket[i][j];
        }
      }
      nums[i] = 0;
    }
    System.out.println("第三輪======"+Arrays.toString(arr));
  }

測試

     int[] arr = { 26, 5, 317, 548, 64, 114};
    radixSort(arr);


根據上面的程式碼可以得到以下程式碼

  public static void radixSort2(int[] arr) {
    int[] nums = new int[10];
    int[][] bucket = new int[10][arr.length];
    int element;
    int maxIndex = 0;
    int index = 0;
    for (int i = 1; i < arr.length; i++) {
      if (arr[maxIndex] < arr[i]) {
        maxIndex = i;
      }
    }
    int maxLength = (arr[maxIndex] + "").length();
    for (int i = 0,n = 1; i < maxLength; i++,n *= 10) {
      for (int j : arr) {
        element = j /n % 10;
        bucket[element][nums[element]] = j;
        nums[element]++;
      }
      index = 0;
      for (int j = 0; j < nums.length; j++) {
        if (nums[j] != 0) {
          for (int k = 0; k < nums[j]; k++) {
            arr[index++] = bucket[j][k];
          }
        }
        nums[j] = 0;
      }
      System.out.println("第三輪======"+Arrays.toString(arr));
    }

  }

測試

   int[] arr = { 26, 5, 317, 548, 64, 114};
    radixSort2(arr);

可以發現結果是一樣的