当前位置:首页 > JavaScript

js实现归并

2026-02-01 00:29:04JavaScript

归并排序原理

归并排序是一种分治算法,通过递归将数组拆分为最小单元(单元素),再按顺序合并有序子数组。其核心是分解合并两个操作,时间复杂度为 O(n log n),空间复杂度为 O(n)。

实现步骤

分解阶段 将数组不断二分,直到子数组长度为1。递归调用分解函数:

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]);
      i++;
    } else {
      result.push(right[j]);
      j++;
    }
  }

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

完整代码示例

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]);
      i++;
    } else {
      result.push(right[j]);
      j++;
    }
  }

  return [...result, ...left.slice(i), ...right.slice(j)];
}

// 使用示例
const array = [5, 3, 8, 4, 2];
console.log(mergeSort(array)); // 输出 [2, 3, 4, 5, 8]

关键点说明

  • 稳定性:归并排序是稳定排序,相等元素的相对位置不变。
  • 空间消耗:合并时需要临时数组,非原地排序。
  • 优化方向:对小规模子数组可改用插入排序减少递归开销。

可视化过程

以数组 [5, 3, 8, 4, 2] 为例:

js实现归并

  1. 分解为 [5,3][8,4,2]
  2. 继续分解至单元素
  3. 逐步合并为 [3,5][2,4,8]
  4. 最终合并为 [2,3,4,5,8]

标签: js
分享给朋友:

相关文章

js实现跑马灯

js实现跑马灯

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

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…

js实现删除

js实现删除

使用 splice 方法删除数组元素 splice 方法可以删除数组中的元素,并返回被删除的元素。它接受两个参数:起始索引和要删除的元素数量。 const array = [1, 2, 3, 4…

js 实现日历

js 实现日历

实现日历的基本思路 日历的核心功能是展示日期,并允许用户进行日期选择或导航。JavaScript 可以动态生成日历的 HTML 结构,并处理用户交互逻辑。 基础日历结构 日历通常包含头部(显示月份和…

js实现图片移动

js实现图片移动

使用CSS和JavaScript实现图片移动 方法一:使用CSS动画结合JavaScript控制 通过CSS定义动画关键帧,JavaScript动态添加或移除动画类。 /* CSS部分 */ .m…

js实现div隐藏

js实现div隐藏

使用CSS的display属性隐藏div 通过设置元素的display属性为none,可以完全隐藏div元素。这种方法不仅隐藏元素,还会从文档流中移除,不占据页面空间。 document.getEl…