当前位置:首页 > JavaScript

js实现复杂度n的排序

2026-03-02 02:57:29JavaScript

实现复杂度为 O(n) 的排序算法

在 JavaScript 中,实现时间复杂度为 O(n) 的排序算法通常需要满足特定条件,例如数据范围有限或具有特殊结构。以下是几种常见的 O(n) 排序方法:

计数排序(Counting Sort)

计数排序适用于整数且范围较小的数据集。核心思想是通过统计每个元素的出现次数,然后按顺序输出。

function countingSort(arr) {
  const max = Math.max(...arr);
  const count = new Array(max + 1).fill(0);
  const output = [];

  for (const num of arr) {
    count[num]++;
  }

  for (let i = 0; i < count.length; i++) {
    while (count[i] > 0) {
      output.push(i);
      count[i]--;
    }
  }

  return output;
}

桶排序(Bucket Sort)

桶排序将数据分到有限数量的桶中,每个桶单独排序(通常使用其他排序算法),最后合并结果。当数据分布均匀时,时间复杂度接近 O(n)。

function bucketSort(arr, bucketSize = 5) {
  const min = Math.min(...arr);
  const max = Math.max(...arr);
  const bucketCount = Math.floor((max - min) / bucketSize) + 1;
  const buckets = new Array(bucketCount).fill().map(() => []);

  for (const num of arr) {
    const bucketIndex = Math.floor((num - min) / bucketSize);
    buckets[bucketIndex].push(num);
  }

  const sorted = [];
  for (const bucket of buckets) {
    bucket.sort((a, b) => a - b);
    sorted.push(...bucket);
  }

  return sorted;
}

基数排序(Radix Sort)

基数排序按数字的每一位进行排序,从最低位到最高位。适用于整数或固定长度的字符串排序。

js实现复杂度n的排序

function radixSort(arr) {
  const maxDigits = Math.max(...arr).toString().length;
  for (let i = 0; i < maxDigits; i++) {
    const buckets = Array.from({ length: 10 }, () => []);
    for (const num of arr) {
      const digit = getDigit(num, i);
      buckets[digit].push(num);
    }
    arr = buckets.flat();
  }
  return arr;
}

function getDigit(num, place) {
  return Math.floor(Math.abs(num) / Math.pow(10, place)) % 10;
}

注意事项

  1. 数据范围限制:计数排序和基数排序要求数据为整数,且范围不宜过大。
  2. 空间复杂度:这些算法通常需要额外空间(如计数数组或桶),空间复杂度可能较高。
  3. 稳定性:基数排序和计数排序是稳定排序,桶排序的稳定性取决于桶内排序算法。

以上方法在特定条件下可实现 O(n) 时间复杂度,但需根据实际数据特性选择合适的算法。

标签: 复杂度js
分享给朋友:

相关文章

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…