第四章 字串1
阿新 • • 發佈:2021-06-06
演算法思維:
-
基數排序的趟數就是最大數的長度
-
通過10個桶來收集數值,先對個位的數值對應到count陣列進行計數,然後將計數陣列累加
-
通過累加後的陣列可以確定哪幾個元素在哪個位置
-
如下:count[5] = 7,前面有6個元素,並且 5,6號下標均為個位含有5的數
-
count [2, 3, 4, 4, 5, 7, 7, 7, 7, 7]
-
result [240, 430, 421, 532, 124, 115, 305]
-
NOTE: 計數累加陣列 和 倒序回填元素保證了演算法的穩定性
package simpleAlgorithm; import java.util.Arrays; /** * @Author: WhaleFall541 * @Date: 2021/6/12 22:59 * [視訊](https://www.bilibili.com/video/BV184411L79P?t=650) * 演算法思維: * 基數排序的趟數就是最大數的長度 * 通過10個桶來收集數值,先對個位的數值對應到count陣列進行計數,然後將計數陣列累加 * 通過累加後的陣列可以確定哪幾個元素在哪個位置 * 如下:count[5] = 7,前面有6個元素,並且 5,6號下標均為個位含有5的數 * count [2, 3, 4, 4, 5, 7, 7, 7, 7, 7] * result [240, 430, 421, 532, 124, 115, 305] * NOTE: 計數累加陣列 和 倒序回填元素保證了演算法的穩定性 */ public class RadixSort { public static void main(String[] args) { int[] arr = new int[]{444444224, 240, 115, 532, 305, 430, 124}; radixSort(arr); System.out.println(Arrays.toString(arr)); } static void radixSort(int[] arr) { int n = arr.length; if (n == 0) return; // 1. 求出最大數 int max = arr[0]; for (int i = 0; i < n; i++) if (arr[i] > max) max = arr[i]; // 計算出最大數的位數 int bit = String.valueOf(max).length(); for (int i = 0; i < bit; i++) { int base = (int) Math.pow(10, i); int[] count = new int[10]; int[] result = new int[arr.length]; // 根據位數0-9分別對count陣列中對應位置累加 for (int j = 0; j < n; j++) { // 位數上的值 int number = arr[j] / base % 10; count[number]++; } // 累加計數 for (int j = 1; j < count.length; j++) { count[j] = count[j - 1] + count[j]; } for (int j = n - 1; j >= 0; j--) { int number = arr[j] / base % 10; // 按照累加陣列 放回元素到result中 // count [2, 3, 4, 4, 5, 7, 7, 7, 7, 7] // result [240, 430, 421, 532, 124, 115, 305] // --count[number] 表示對應位置上的陣列前面有多少個元素 // 比如 count[5] = 7,前面有6個元素,並且 5,6號下標均為個位含有5的數 result[--count[number]] = arr[j]; } // 將結果集放回到原陣列準備下一輪排序 System.arraycopy(result, 0, arr, 0, n); //清空計數陣列 Arrays.fill(count, 0); } } }