写一个方法实现“基数排序算法”,并解释下时间复杂度和空间复杂度

基数排序(Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这里我们提供一个基数排序算法的简单实现,并使用JavaScript语言来编写。

function radixSort(arr) {
    // 1. 找到数组中最大的数,确定排序的位数
    let max = Math.max(...arr);
    let maxDigits = String(max).length;

    // 2. 从最低位开始,对数组中的每个数进行排序
    for (let i = 0; i < maxDigits; i++) {
        let buckets = Array.from({ length: 10 }, () => []); // 初始化10个桶
        for (let num of arr) {
            let digit = getDigit(num, i);
            buckets[digit].push(num); // 将数字放入对应的桶中
        }
        // 重新组合数组
        arr = [].concat(...buckets);
    }

    return arr;
}

// 辅助函数,用于获取数字的指定位数
function getDigit(num, place) {
    return String(num).padStart(String(num).length + 1, '0').split('')[place] | 0;
}

// 示例
console.log(radixSort([170, 45, 75, 90, 802, 24, 2, 66]));

时间复杂度:
基数排序的时间复杂度是O(nk),其中n是待排序元素个数,k是数字的位数。这是因为我们需要对每个数字的每一位进行排序,而每一位的排序都需要遍历整个数组。然而,由于每一位的排序都是线性的(即O(n)),所以总的时间复杂度是O(nk)。在实际应用中,k通常是一个相对较小的常数,因此基数排序在处理大量整数时通常比其他O(n^2)或O(nlogn)的排序算法更高效。

空间复杂度:
基数排序的空间复杂度是O(n+k),其中n是待排序元素个数,k是桶的数量。在这个例子中,我们使用了10个桶(0-9),所以k是10。每个桶中存储的元素数量最多为n/k,因此总的空间复杂度为O(n+k)。然而,由于k是一个相对较小的常数(在这个例子中是10),所以空间复杂度可以简化为O(n)。需要注意的是,这个空间复杂度不包括输入数组本身所占用的空间。

posted @   王铁柱6  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示