基数排序(Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。以下是关于基数排序的一些基础概念、优势、类型、应用场景以及如何用JavaScript实现它。
基数排序通过按照数字的每一位进行排序,从最低有效位(个位)开始,逐步向高位进行,直到最高位排序完成。它通常使用稳定的排序算法(如计数排序)作为子过程。
基数排序主要分为两种类型:
基数排序适用于大量数据的整数排序,特别是当位数较少时。例如,电话号码、身份证号码等排序。
以下是一个使用LSD方法的基数排序的JavaScript实现示例:
function radixSort(arr) {
const max = Math.max(...arr);
let exp = 1; // 指数,表示当前位数(个位、十位、百位等)
while (Math.floor(max / exp) > 0) {
arr = countingSortByDigit(arr, exp);
exp *= 10;
}
return arr;
}
function countingSortByDigit(arr, exp) {
const n = arr.length;
const output = new Array(n).fill(0);
const count = new Array(10).fill(0);
// 统计每个桶中的元素个数
for (let i = 0; i < n; i++) {
const digit = Math.floor(arr[i] / exp) % 10;
count[digit]++;
}
// 将count[i]更新为前i个桶中元素的总数
for (let i = 1; i < 10; i++) {
count[i] += count[i - 1];
}
// 构建输出数组(从后向前遍历以保证稳定性)
for (let i = n - 1; i >= 0; i--) {
const digit = Math.floor(arr[i] / exp) % 10;
output[count[digit] - 1] = arr[i];
count[digit]--;
}
return output;
}
// 示例用法
const arr = [170, 45, 75, 90, 802, 24, 2, 66];
console.log(radixSort(arr)); // 输出: [2, 24, 45, 66, 75, 90, 170, 802]
基数排序的空间复杂度较高,因为它需要额外的存储空间来保存计数数组和输出数组。此外,基数排序对于非整数数据(如浮点数、字符串等)需要进行适当的预处理或扩展算法才能应用。
领取专属 10元无门槛券
手把手带您无忧上云