写一个方法实现“基数排序算法”,并解释下时间复杂度和空间复杂度
基数排序(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)。需要注意的是,这个空间复杂度不包括输入数组本身所占用的空间。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了