O(n)的排序算法-(基数排序及其js实现)

基数排序(Radix Sort)

  • 适用范围:将整数按位数切割成不同的数字,按每位分别比较。不只是适用整数,也适用于字符串和特定格式的浮点数等
    • 最高位优先(MSD),最低位优先(LSD)
  • 核心:(以整数为例)
    • 基:被排序的元素的’个、十、百位’等
    • 桶:“基”的每一位都有取值范围,一般数字是0-9共10中,10个桶
  • 步骤:
for(每一个基) {
    // 循环内,以某一个’基‘为依据
    遍历array,将元素放入对应的桶bucket
    遍历桶bucket,将元素放回数据集
}
  • 补充:

    • 稳定排序,时间复杂度可以认为是线性的O(n)
    • 更准确点讲O(d(n+radix)),radix取值范围,d表示基个数
  • 以下写法带排序数组有负数是有问题的,如果需要排序带负数的,需要设置偏移量offset,使得最小数为0

function radixSort(arr, maxDigit) {
    let mod = 10;
    let dev = 1;
    let counter = [];
    for (let i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
        for (let j = 0; j < arr.length; j++) {
            let bucketIdx = parseInt((arr[j] % mod) / dev);
            if (counter[bucketIdx] == null) {
                counter[bucketIdx] = [];
            }

            counter[bucketIdx].push(arr[j]);
        }

        let idx = 0;
        for (let j = 0; j < counter.length; j++) {
            let bucket = counter[j];
            if (bucket != null) {
                for (let k = 0; k < bucket.length; k++) {
                    arr[idx++] = bucket[k];
                }
            }
        }

        counter = []; //清空
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值