当前位置:首页 > 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实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = documen…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…