编辑代码

const RADIX = 10;
const label: string[] = ['个位排序', '十位排序', '百位排序', '千位排序', '万位排序'];
let labelIdx: number = 0;

function countSort(arr: number[], n: number, d: number): void {
    // 计数数组
    let countArr: number[] = new Array(RADIX).fill(0);
    // 暂存每趟排序结果
    let sortArr: number[] = new Array(n).fill(0);
    
    // 统计每一位上的数的出现次数
    for (let i: number = 0; i < n; ++i) {
        countArr[Math.trunc(arr[i] / d) % RADIX]++;
    }
    console.log(countArr);

    // 根据统计的每一位上的数的出现次数计算每个数的位序
    for (let i: number = 1; i < RADIX; ++i) {
        countArr[i] += countArr[i - 1];
    }
    console.log(countArr);
    
    // 排序
    for (let i: number = n - 1; i >= 0; --i) {
        sortArr[countArr[Math.trunc(arr[i] / d) % RADIX] - 1] = arr[i];
        // 该位上的数的出现次数减一
        countArr[Math.trunc(arr[i] / d) % RADIX]--;
    }

    // 赋值回原数组
    for (let i: number = 0; i < n; i++) {
        arr[i] = sortArr[i];
    }
    console.log(label[labelIdx++], arr);
}

function radixSort(arr: number[], n: number): void {
    // 求最大值,以此计算出最大位数
    let maxValue: number = Math.max(...arr);
    labelIdx = 0;
    // d为位数,采用低位优先排序:个、十、百...
    for (let d: number = 1; Math.trunc(maxValue / d) > 0; d *= RADIX) {
        countSort(arr, n, d);
    }
}

const arr1: number[] = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48];
const arr2: number[] = [90, 57, 100, 44, 87, 9, 4, 34, 25, 58];
const arr3: number[] = [9000, 44, 2222, 444, 1, 5, 3, 88, 421];
radixSort(arr1, arr1.length);
console.log('结果:', arr1, '\n');
radixSort(arr2, arr2.length)
console.log('结果:', arr2, '\n')
radixSort(arr3, arr3.length)
console.log('结果:', arr3, '\n')