十大经典排序算法系列(七) 基数排序 js版

就是计数排序改进版

 

'use strict'

var arr = [1010, 1000, 999, 666, 444, 333, 333, 123, 50, 22, 12, 10, 5, 2, 1, 0, 0];

function radixSort(arr, numLenght) {

    function strLenght(str) {
        var str = str.toString();
        return str.length;
    }

    var resultArr = [],
        count = 0,
        mo = 10,
        yu = 1;

    // 控制 计数排序的次数
    while (numLenght) {
        // 总是初始化一个临时数组
        let tmpArr = [];
        var arrLenght = arr.length;

        // arr 数组索引i值, 元素的最少长度 1
        var i = 0, strL = 1;

        // 计数排序
        while (arrLenght) {
            arrLenght--;
            count += 1;

            // 不足位的元素 用 0 补位
            let index = Math.floor((arr[i] % mo) / yu);

            // 等于0时, 已经有序. splice元素,并追加到排序好的数组末尾.
            // 减少待排序元素个数, 优化性能.
            if (index == 0) {
                if (strL == strLenght(arr[i])) {
                    resultArr.push(arr.splice(i, 1)[0]);
                    continue
                    // splice 元素后,数组总长度减少1,索引i值 不增长, 跳出本次循环.
                }

            }

            // 不是数组时, 初始化为空数组
            if (!tmpArr[index]) {
                tmpArr[index] = [];
            }

            // 二维数组 添加元素
            tmpArr[index].push(arr[i]);
            // arr 数组索引自增
            i++;
        }
        console.log(count);

        arr = [];
        // 从二维数组中, 按顺序 push 到新空数组中, 准备下次 计数排序
        for (let i = 0; i < tmpArr.length; i++) {
            var innerArr = tmpArr[i];
            if (innerArr) {
                for (let v of innerArr) {
                    arr.push(v);
                    // count += 1;
                }
            }
        }
        mo *= 10, yu *= 10, numLenght--, strL++;

        // 数字位数 自减到等于0时, arr 数组已经有序, 合并即可
        if (numLenght == 0) {
            resultArr = resultArr.concat(arr);
        }
        // console.log(resultArr);

    }
    console.log(count);
    return resultArr;
}

console.log(radixSort(arr, 4));

 

你可能感兴趣的:(数据结构与算法)