JavaScript 实现基数排序算法详解

作者:代码拾荒时间:2026-10-31 09:01:10浏览:633

本文介绍基于 JavaScript 的基数排序实现。作为非比较排序算法,它通过按位切割整数并逐位排序,从低位到高位处理数据。文章详细解析了获取最大位数、桶排序及合并桶的步骤,并分析了其时间复杂度 O(nk) 和空间复杂度 O(n+k),适用于位数较小的整数排序场景。

基数排序(Radix Sort)属于非比较性排序算法,凭借独特的设计思想和高效性能受到广泛关注。本文将深入探讨其核心原理及具体实现方法。

基数排序概念

基数排序依据整数的位数值进行排序。它将整数按位数拆解,并针对每一位分别进行比较。核心策略是从最低位向最高位依次排序,最终生成有序序列。

基数排序实现方法

以下展示基于 JavaScript 的基数排序代码实现:

// 获取数字的指定位数上的数字
function getDigit(num, place) {
  return Math.floor(Math.abs(num) / Math.pow(10, place)) % 10;
}

// 获取数字的位数
function digitCount(num) {
  if (num === 0) return 1;
  return Math.floor(Math.log10(Math.abs(num))) + 1;
}

// 获取数字中最大位数
function mostDigits(nums) {
  let maxDigits = 0;
  for (let i = 0; i < nums.length; i++) {
    maxDigits = Math.max(maxDigits, digitCount(nums[i]));
  }
  return maxDigits;
}

// 基数排序函数
function radixSort(nums) {
  const maxDigits = mostDigits(nums);

  for (let k = 0; k < maxDigits; k++) {
    const buckets = Array.from({ length: 10 }, () => []);

    for (let i = 0; i < nums.length; i++) {
      const digit = getDigit(nums[i], k);
      buckets[digit].push(nums[i]);
    }

    nums = [].concat(...buckets);
  }

  return nums;
}

// 示例
const unsortedArray = [170, 45, 75, 90, 802, 24, 2, 66];
const sortedArray = radixSort(unsortedArray);
console.log(sortedArray); // 输出 [2, 24, 45, 66, 75, 90, 170, 802]

算法原理剖析

  • 确定最大位数:遍历数组找出最大数字的位数,以此决定排序所需的轮数。
  • 按位排序:根据当前轮次的位数对数组元素进行排序,并将其放入对应的桶中。
  • 合并桶数据:按顺序将各桶中的数字合并,形成新的数组。
  • 循环执行:重复上述过程,直到所有位数的排序任务完成。

基数排序通过多轮按位处理,逐步完成整个数组的排序工作。

时间与空间复杂度分析

在特定场景下,基数排序能在时间和空间复杂度上表现优异。

时间复杂度

基数排序的时间复杂度为 O(nk),其中 n 代表数组长度,k 代表最大位数。当 k 值相对较小时,该算法效率显著。

空间复杂度

基数排序需要占用额外空间,其空间复杂度为 O(n + k),其中 n 为数组长度,k 为桶的数量。

总结

基数排序是一种非比较性排序算法,通过按位数逐步排序获得有序序列。尽管在部分场景下性能出色,实际应用中需关注数据特征和位数分布,以确保排序有效性。选择排序算法时,应结合具体需求与数据分布综合考量,以达成最佳排序效果。

本文关于 JS 实现基数排序的示例代码介绍至此。如需了解更多 JS 基数排序相关内容,请查阅本站过往文章或继续浏览后续文章,感谢支持。

作者最新文章