当前位置:首页 > JavaScript

js实现并轨排序

2026-02-03 02:55:57JavaScript

并轨排序(Merge Sort)实现

并轨排序是一种分治算法,通过递归将数组分成两半,分别排序后再合并。以下是JavaScript的实现方法:

js实现并轨排序

递归实现

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;
  let 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 mergeSortIterative(arr) {
  let step = 1;
  const n = arr.length;

  while (step < n) {
    let left = 0;
    while (left < n - step) {
      const mid = left + step;
      const right = Math.min(left + 2 * step, n);
      mergeInPlace(arr, left, mid, right);
      left = left + 2 * step;
    }
    step *= 2;
  }
  return arr;
}

function mergeInPlace(arr, start, mid, end) {
  const left = arr.slice(start, mid);
  const right = arr.slice(mid, end);
  let i = 0;
  let j = 0;
  let k = start;

  while (i < left.length && j < right.length) {
    if (left[i] <= right[j]) {
      arr[k] = left[i];
      i++;
    } else {
      arr[k] = right[j];
      j++;
    }
    k++;
  }

  while (i < left.length) {
    arr[k] = left[i];
    i++;
    k++;
  }

  while (j < right.length) {
    arr[k] = right[j];
    j++;
    k++;
  }
}

性能特点

  • 时间复杂度:O(n log n) 在所有情况下
  • 空间复杂度:O(n) 需要额外空间存储临时数组
  • 稳定排序:相等元素的相对位置不会改变

使用示例

const array = [5, 3, 8, 4, 2, 7, 1, 10];
console.log(mergeSort(array)); // [1, 2, 3, 4, 5, 7, 8, 10]
console.log(mergeSortIterative(array.slice())); // 同样结果

优化建议

对于小规模数组(通常n<15),可以切换到插入排序以提高性能。合并过程可以使用双指针技术减少内存分配。

标签: js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callback) {…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现报表

js实现报表

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

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似:…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…