0

0

JavaScript 中归并排序的实现原理与常见错误修复

碧海醫心

碧海醫心

发布时间:2026-03-07 13:16:01

|

881人浏览过

|

来源于php中文网

原创

JavaScript 中归并排序的实现原理与常见错误修复

本文详解归并排序在 javascript 中的正确实现,重点指出原代码中合并循环条件错误、递归调用缺失及逻辑断层等关键问题,并提供可直接运行的完整修复版本。

本文详解归并排序在 javascript 中的正确实现,重点指出原代码中合并循环条件错误、递归调用缺失及逻辑断层等关键问题,并提供可直接运行的完整修复版本。

归并排序(Merge Sort)是一种经典的分治(Divide and Conquer)排序算法,其核心思想是:递归地将数组二分至单元素子数组(此时天然有序),再逐层合并两个已排序的子数组。然而,初学者在实现时常因忽略递归本质或边界条件而陷入“看似结构正确却无法排序”的困境。原代码存在三个关键缺陷,需逐一修正:

? 主要错误分析

  1. mergeTwoSortedArrays 的 while 循环条件错误
    原代码使用 while (i

  2. mergeSort 缺失递归调用
    原函数仅对原始数组做一次二分(c 和 d),但未对 c 和 d 本身递归调用 mergeSort,而是直接传入未排序的子数组给 mergeTwoSortedArrays。这导致合并操作始终在“未排序数据”上进行,完全违背归并排序前提——必须确保传入 mergeTwoSortedArrays 的两个参数已是各自有序的数组

  3. 命名与职责混淆
    solve 方法调用 mergeSort,但 mergeSort 实际未执行完整排序流程;且方法名 mergeSort 与 mergeSortFunction 不一致,增加理解成本。应统一为语义清晰的命名(如 mergeSortFunction → mergeSort),并确保入口方法职责明确。

✅ 修复后的完整实现

以下为修复所有问题、符合标准归并排序逻辑的可运行代码:

Runwayml(AI painting)
Runwayml(AI painting)

Runway 平台的文本生成图像AI工具

下载
const mergeSort = {
  solve: function (A) {
    return this.mergeSort(A);
  },

  mergeTwoSortedArrays: function (A, B) {
    let i = 0, j = 0, k = 0;
    const C = [];

    // ✅ 正确主合并循环:仅依赖索引边界
    while (i < A.length && j < B.length) {
      if (A[i] <= B[j]) { // 使用 <= 保证稳定性(相等时优先取左)
        C[k++] = A[i++];
      } else {
        C[k++] = B[j++];
      }
    }

    // ✅ 补充剩余元素(无需额外条件判断)
    while (i < A.length) C[k++] = A[i++];
    while (j < B.length) C[k++] = B[j++];

    return C;
  },

  mergeSort: function (a) {
    const n = a.length;
    if (n <= 1) return a; // 基础情况:单元素或空数组直接返回

    // ✅ 二分:严格按索引切分,避免 Math.floor 引发的歧义(对偶数/奇数均适用)
    const mid = Math.floor(n / 2);
    const left = a.slice(0, mid);      // [0, mid)
    const right = a.slice(mid);         // [mid, end)

    // ✅ 关键修复:递归排序左右子数组,再合并
    return this.mergeTwoSortedArrays(
      this.mergeSort(left),
      this.mergeSort(right)
    );
  }
};

// ? 使用示例
const inputArray = [38, 27, 43, 3, 9, 82, 10];
const sortedArray = mergeSort.solve(inputArray);
console.log(sortedArray); 
// 输出: [3, 9, 10, 27, 38, 43, 82]

⚠️ 注意事项与最佳实践

  • 避免原地修改风险:本实现全程使用 slice() 创建新数组,确保纯函数特性(无副作用)。若需原地排序,须改用索引参数传递(如 mergeSort(arr, left, right)),但复杂度显著上升,初学阶段不建议。
  • 稳定性保障:mergeTwoSortedArrays 中使用
  • 时间复杂度:严格保持 $O(n \log n)$,不受输入数据分布影响;空间复杂度为 $O(n)$,主要消耗在临时合并数组 C 及递归调用栈。
  • 调试技巧:可在 mergeSort 中添加 console.log('Split:', left, 'and', right),或在 mergeTwoSortedArrays 返回前打印 C,直观验证分治与合并过程是否符合预期。

掌握归并排序的关键,在于深刻理解“分治”的闭环逻辑:分(Divide)→ 治(Conquer via recursion)→ 合(Combine)。任何一环断裂(如遗漏递归),都将导致算法退化为无效的数组拼接。通过本次修复,你不仅解决了具体 Bug,更夯实了对分治范式本质的认知基础。

立即学习Java免费学习笔记(深入)”;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

252

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1049

2024.03.01

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

409

2023.09.04

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

104

2023.09.25

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

434

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

601

2023.08.10

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

953

2023.09.19

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

419

2023.08.08

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.8万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号