编辑代码

import java.util.Arrays;

public class RadixSort {

    public static void radixSort(int[] arr) {
        int max = getMax(arr);
        for (int exp = 1; max / exp > 0; exp *= 10) {
            countingSortByDigit(arr, exp);
        }
    }

    private static void countingSortByDigit(int[] arr, int exp) {
        final int RADIX = 10;
        int[] count = new int[RADIX];
        int[] result = new int[arr.length];

        // 计数
        for (int value : arr) {
            count[(value / exp) % RADIX]++;
        }

        // 累加计数
        for (int i = 1; i < RADIX; i++) {
            count[i] += count[i - 1];
        }

        // 输出到结果数组
        for (int i = arr.length - 1; i >= 0; i--) {
            result[count[(arr[i] / exp) % RADIX] - 1] = arr[i];
            count[(arr[i] / exp) % RADIX]--;
        }

        // 将结果复制回原数组
        System.arraycopy(result, 0, arr, 0, arr.length);
    }

    private static int getMax(int[] arr) {
        int max = arr[0];
        for (int value : arr) {
            if (value > max) {
                max = value;
            }
        }
        return max;
    }

    public static void main(String[] args) {
        int[] arr = {170, 45, 75, 90, 802, 24, 2, 66};
        radixSort(arr);
        System.out.println("线性计数排序后: " + Arrays.toString(arr));
    }
}