当前位置:首页 > JavaScript

js实现归并

2026-03-13 22:36:47JavaScript

归并排序原理

归并排序是一种分治算法,通过递归将数组拆分为最小单元(单个元素),再逐步合并有序子数组。核心思想是“分而治之”,时间复杂度为O(n log n),空间复杂度为O(n)。

js实现归并

递归实现

递归法通过不断二分数组直至长度为1,再合并有序子数组:

js实现归并

function mergeSort(arr) {
  if (arr.length <= 1) return arr;

  const mid = Math.floor(arr.length / 2);
  const left = mergeSort(arr.slice(0, mid));
  const right = mergeSort(arr.slice(mid));

  return merge(left, right);
}

function merge(left, right) {
  let result = [];
  let i = 0, j = 0;

  while (i < left.length && j < right.length) {
    if (left[i] < right[j]) {
      result.push(left[i++]);
    } else {
      result.push(right[j++]);
    }
  }

  return result.concat(left.slice(i)).concat(right.slice(j));
}

迭代实现

非递归版本使用循环模拟分治过程,避免调用栈过深:

function mergeSort(arr) {
  let step = 1;
  const n = arr.length;

  while (step < n) {
    let l = 0;
    while (l < n) {
      const m = Math.min(l + step, n);
      const r = Math.min(l + 2 * step, n);
      merge(arr, l, m, r);
      l += 2 * step;
    }
    step *= 2;
  }
  return arr;
}

function merge(arr, start, mid, end) {
  const temp = [...arr];
  let i = start, j = mid, k = start;

  while (i < mid && j < end) {
    arr[k++] = temp[i] <= temp[j] ? temp[i++] : temp[j++];
  }

  while (i < mid) arr[k++] = temp[i++];
}

性能优化点

  • 小数组切换插入排序:当子数组长度较小时(如<15),插入排序更高效
  • 避免重复分配内存:预分配临时数组复用
  • 边界检查优化:提前终止已有序数组的合并

复杂度分析

  • 时间:始终为O(n log n),不受输入数据影响
  • 空间:需要额外O(n)存储空间
  • 稳定性:是稳定排序算法(相等元素不改变相对位置)

使用示例

const arr = [3, 44, 38, 5, 47, 15];
console.log(mergeSort(arr)); // [3, 5, 15, 38, 44, 47]

标签: js
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现计算器

js实现计算器

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

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现报表

js实现报表

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

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…