当前位置:首页 > 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;
}

条件要求

  • 数据为整数且范围 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;
}

条件要求

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

基数排序(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;
}

条件要求

js实现复杂度n的排序

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

注意事项

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

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

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现文字滚动

js实现文字滚动

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

js 实现页面刷新

js 实现页面刷新

使用 location.reload() location.reload() 是原生 JavaScript 提供的页面刷新方法。调用该方法会重新加载当前页面,相当于点击浏览器的刷新按钮。 // 基本…

js实现复制功能实现

js实现复制功能实现

使用document.execCommand方法(传统方式,已逐渐被弃用) 传统方式通过document.execCommand('copy')实现复制功能,需先选中文本。以下是一个完整示例: fu…

js实现隐藏div

js实现隐藏div

隐藏div的几种方法 使用JavaScript隐藏div元素可以通过多种方式实现,以下是几种常见的方法: 方法一:修改style.display属性 将div的display属性设置为"none"…