写一个方法实现“基数排序算法”,并解释下时间复杂度和空间复杂度
基数排序(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)。需要注意的是,这个空间复杂度不包括输入数组本身所占用的空间。