十大经典排序算法系列(七) 基数排序 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));

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值