当前位置:首页 > JavaScript

js实现复杂度n的排序

2026-01-31 11:40:42JavaScript

时间复杂度为 O(n) 的排序算法

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

计数排序(Counting Sort)

适用于整数且范围较小的数据排序。

function countingSort(arr) {
  const max = Math.max(...arr);
  const min = Math.min(...arr);
  const count = Array(max - min + 1).fill(0);
  const output = Array(arr.length);

  // 统计每个元素的出现次数
  for (let num of arr) {
    count[num - min]++;
  }

  // 计算累加位置
  for (let i = 1; i < count.length; i++) {
    count[i] += count[i - 1];
  }

  // 反向填充结果数组(保证稳定性)
  for (let i = arr.length - 1; i >= 0; i--) {
    const num = arr[i];
    output[count[num - min] - 1] = num;
    count[num - min]--;
  }

  return output;
}

条件要求

js实现复杂度n的排序

  • 数据为整数且范围 max - min 不宜过大(否则空间复杂度高)。

桶排序(Bucket Sort)

适用于数据均匀分布的场景。

function bucketSort(arr, bucketSize = 5) {
  if (arr.length === 0) return arr;

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

  // 数据分桶
  for (let num of arr) {
    const bucketIdx = Math.floor((num - min) / bucketSize);
    buckets[bucketIdx].push(num);
  }

  // 对每个桶排序(可选用插入排序等)
  const result = [];
  for (let bucket of buckets) {
    bucket.sort((a, b) => a - b);
    result.push(...bucket);
  }

  return result;
}

条件要求

js实现复杂度n的排序

  • 数据分布均匀,桶数量合理。

基数排序(Radix Sort)

适用于整数或字符串的字典序排序。

function radixSort(arr) {
  const max = Math.max(...arr).toString().length;
  for (let digit = 0; digit < max; digit++) {
    const buckets = Array(10).fill().map(() => []);
    for (let num of arr) {
      const str = num.toString().padStart(max, '0');
      const radix = parseInt(str[max - 1 - digit]) || 0;
      buckets[radix].push(num);
    }
    arr = buckets.flat();
  }
  return arr;
}

条件要求

  • 数据为固定位数的整数或字符串。

注意事项

  1. 非比较排序:上述算法均通过数据特性(如范围、位数)实现线性复杂度,但需额外空间。
  2. 稳定性:计数排序和基数排序是稳定排序,桶排序的稳定性取决于子排序算法。
  3. 局限性:若数据范围过大或不符合条件,退化为 O(n log n) 算法(如快速排序)更实际。

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

相关文章

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…

js实现滑动

js实现滑动

实现滑动效果的方法 在JavaScript中实现滑动效果可以通过多种方式完成,以下是几种常见的实现方法: 使用CSS过渡和JavaScript触发 通过CSS定义过渡效果,JavaScript控制触…

js实现的游戏

js实现的游戏

JavaScript 游戏开发基础 JavaScript 是开发网页游戏的流行选择,因其无需插件即可在浏览器中运行。以下是一些关键技术和资源: HTML5 Canvas Canvas 提供了绘制图形…