js实现归并排序(mergeSort)

news2024/11/13 9:14:00

理解归并排序

归并排序

归并排序是一种基于分治思想的排序算法,它将一个待排序的序列分为两个子序列,分别对子序列进行排序,然后将排好序的子序列合并成一个有序的序列。这个过程可以递归地进行,直到序列被划分为只有一个元素时停止递归。

在归并排序的过程中,将序列分为两个子序列的操作称为分治,合并两个有序子序列为一个有序序列的操作称为归并。分治和归并是归并排序的核心操作。

具体而言,归并排序的过程如下:

  1. 将序列递归地分为左右两个子序列,直到每个子序列只有一个元素。
  2. 对左右两个子序列进行归并排序,得到两个有序子序列。
  3. 合并两个有序子序列,得到一个有序序列。

归并排序的时间复杂度为 O(nlogn),相较于其他排序算法具有较好的稳定性和效率。

归并排序实现代码

/**
 * 归并排序
 * @param {要排序的数组} arr
 */
function mergeSort(arr) {
  if (arr.length > 1) {
    const middle = Math.floor(arr.length / 2);
    const left = mergeSort(arr.slice(0, middle));
    const right = mergeSort(arr.slice(middle, arr.length));
    arr = merge(left, right);
  }
  return arr;
}
// 合并左分支数组和右分支数组,左分支和右分支在自己数组里面已经是有序的。所以就方便很多。
function merge(left, right) {
  // 剪枝优化
  if (left[left.length - 1] <= right[0]) {
    return left.concat(right);
  }
  if (right[right.length - 1] <= left[0]) {
    return right.concat(left);
  }

  let result = [];
  let leftIndex = 0;
  let rightIndex = 0;

  while (leftIndex < left.length && rightIndex < right.length) {
    if (left[leftIndex] <= right[rightIndex]) {
      result.push(left[leftIndex]);
      leftIndex++;
    } else {
      result.push(right[rightIndex]);
      rightIndex++;
    }
  }
  // 将剩余数据拷贝至result
  if (leftIndex < left.length) {
    result = result.concat(left.slice(leftIndex));
  } else {
    result = result.concat(right.slice(rightIndex));
  }
  return result;
}

实现代码详细解说

这段代码实现了归并排序,具体过程就是将待排序的数组一分为二,分别对左右两部分进行排序,然后再将排好序的两部分合并起来,这样就能得到一个完整有序的数组。

在代码中,mergeSort函数是递归调用自己实现的排序函数。如果数组的长度大于1,就将其一分为二,分别对左右两部分进行递归排序,并最终通过merge函数将排好序的两部分合并为一个完整的有序数组。如果数组长度小于等于1,就直接返回该数组。

merge函数的作用就是将两个有序数组合并为一个有序数组。代码首先进行了剪枝优化,判断左右两个数组是否已经有序,如果是的话就直接将它们合并起来返回。如果不是,就使用两个指针leftIndexrightIndex分别遍历左右两个数组,比较它们的元素大小,将较小的元素依次放入result数组中。当其中一个数组遍历完了之后,就将另一个数组中剩余的元素依次拷贝至result数组的末尾。

最后,在代码末尾,我们调用了mergeSort函数并传入一个待排序的数组,最终得到的输出结果就是该数组排序后的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

版本控制 | 如何使用虚幻引擎的多用户编辑(MUE)功能

随着现代虚拟制作技术的发展&#xff0c;电影制片厂不再需要完全依赖实际场景&#xff0c;而是可以在拍摄期间就让虚拟制作设计团队将实景与计算机生成的虚拟内容融合在一起。虚幻多用户编辑&#xff08;Unreal Multi-User Editing&#xff0c;简称MUE&#xff09;可以帮助简化…

【产品方案】后台管理系统设计思路

第一章 前言 相比前端设计&#xff0c;我更喜欢设计后台管理系统。如果说前端设计考验的是共情能力&#xff0c;那后台管理系统设计考研的就是逻辑能力&#xff0c;前者需要站在用户的角度&#xff0c;后者是站在管理者的角度思考。 有幸参与了公司不少业务系统从“0-1”的设计…

使用prometheus时发现mongodb exporter的/metrics数据展示很慢,延迟高

项目场景&#xff1a; 使用prometheusgrafana搭建对mongoDB集群的监控。 问题描述 使用prometheus时发现mongodb exporter的/metrics数据展示接口很慢&#xff0c;延迟高。 看了一下大概是10s 原因分析&#xff1a; 由于是在云服务器上进行搭建的。 经过尝试之后发现创建mo…

Apache Doris学习记录

1. Doris基础学习 中文官网:https://doris.apache.org/zh-CN/docs/dev/summary/basic-summary/ 1.1 doris 简介 Apache Doris 是一个现代化的 MPP(Massively Parallel Processing&#xff0c;即大规模并行处理) 分析型数据库产品 亚秒级响应时间即可获得查询结果 可以支持 10PB…

Python每日一练:最长递增的区间长度(一行代码花样解法)

文章目录 前言一、题目二、一行超人三、分析一下思路 总结 前言 很显然&#xff0c;Python的受众远远大于C&#xff0c;其实笔者本人对Python的理解也是远强于C的&#xff0c;C纯粹是为了假装笔者是个职业选手才随便玩玩的&#xff0c;借着十多年前学的C的功底&#xff0c;强行…

链表(数据结构)

目录 链表 链表的分类 1、单向或者双向 2、带头或者不带头 3、循环或者非循环 总结&#xff1a; 单链表 创建链式结构 创建新节点 尾插 尾删 头插 头删 查找节点 在pos位置后插入 删除pos位置后的节点 销毁 链表 概念&#xff1a; 链表是一种物理结构上非连续的、非顺序的存储结…

c# 数据保存为PDF(二) (Aspose pdf篇)

文章目录 前言关于Aspose PDF使用Aspose.Pdf常用的命名空间和类库1 创建简单的PDF文档2 美化PDF样式2.1 创建测试数据2.2 项目头部样式2.3 全部代码 小结附录参考 前言 项目中需要将数据导出存为PDF格式&#xff0c;试了一下Aspose组件&#xff0c;仅以此记录一下使用感受。 …

设计模式——原型模式(浅拷贝和深拷贝)

是什么&#xff1f; 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象&#xff1b; 结构 抽象原型类&#xff1a;规定了具体原型对象必须实现的Clone&#xff08;&#xff09;方法&#xff1b; 具体原型类&#xff1a;实现抽象…

Elasticsearch:NLP 和 Elastic:入门

自然语言处理 (Natural Language Processing - NLP) 是人工智能 (AI) 的一个分支&#xff0c;专注于尽可能接近人类解释的理解人类语言&#xff0c;将计算语言学与统计、机器学习和深度学习模型相结合。 AI - Artificial Inteligence 人工智能ML - Machine Learning 机器学习DL…

集线器、网桥、交换机

一.集线器 集线器&#xff08;HUB&#xff09;&#xff0c;它是工作在物理层的设备&#xff0c; 由于它只是工作在物理层的设备&#xff0c;所以它并不关心也不可能关心OSI上面几层所涉及的&#xff0c;它的工作机制流程是&#xff1a;从一个端口接收到数据包时&#xff0c;会在…

STL基础

目录 一、STL的诞生 二、STL基本概念 三、STL六大组件 大体分为六大组件&#xff1a;容器、算法、迭代器、仿函数、适配器&#xff08;配接器&#xff09;、空间配置器 四、容器、算法与迭代器的认识 容器container&#xff1a;存放数据地方 算法algorithm&#xff1a;解…

中级软件设计师备考---软件工程2

目录 软件测试分类和要求测试用例设计测试阶段McCabe复杂度软件维护软件过程改进---CMMICMM英文版CMM中文版CMMI 软件测试分类和要求 分类&#xff1a; 灰盒测试&#xff1a;多用于集成测试阶段&#xff0c;不仅关注输出、输入的正确性&#xff0c;同时也关注程序内部的情况。…

MySQL:插入,更新与删除、索引

一、学习目标 掌握如何向表中插入数据掌握更新数据的方法熟悉如何删除数据掌握对数据表基本操作的方法和技巧了解什么是索引掌握创建索引的方法和技巧熟悉如何删除索引熟悉掌握索引的常见问题 二、实验内容 创建表books&#xff0c;对数据表进行插入、更新和删除操作&#x…

SkyWalking集成Logback的使用

SkyWalking集成Logback的使用 将微服务的日志框架去集成SkyWalking&#xff0c;我们希望在我们微服务中日志中&#xff0c;能够记录当前调用链路的id&#xff0c;然后我们再根据这个id去SkyWalking的前端界面中进行搜索找到对应的调用链路记录。 因为springboot默认实现的日志…

Ansible 的脚本 之playbook 剧本

目录 第一章.playbooks的组成 1.1playbooks的组成部分 1.2运行playbook 1.3定义、引用变量 1.4.指定远程主机sudo切换用户 1.6.when条件判断 1.7.迭代 第二章.Templates模块 2.1.准备模板 2.2.修改主机清单文件 2.3.编写 playbook 第三章.tags 模块 3.1.yaml文件编…

操作系统原理 —— 线程的概念、实现方式、多线程模型(十)

什么是线程&#xff0c;为什么要引入线程&#xff1f; 有的进程可能需要 “同时” 做很多事情&#xff0c;而传统的进程只能串行的执行一系列的程序&#xff0c;为此&#xff0c;引入了 “线程” &#xff0c;来增加并发度。 可以把线程理解为 轻量级进程&#xff0c;线程是可…

剧本杀闯关小程序app软件

剧本杀闯关小程序软件是一种结合了角色扮演和解谜游戏元素的互动娱乐产品&#xff0c;目前在市场上越来越受欢迎。以下是剧本杀闯关小程序软件市场行业情况的一些特点&#xff1a; 市场需求增长&#xff1a;随着人们对于线上互动娱乐的需求增加&#xff0c;剧本杀闯关小程序…

maven install的时候报Unable to find main class

目录 问题描述解决办法解决方案一&#xff1a;添加一个主函数解决方案二&#xff1a;将不是web工程的设置跳过解决方案三&#xff1a;打包插件的作用本质上就是将当前项目所依赖的jar打包到一块&#xff0c;这样jar包就可以运行了&#xff0c;我们完全可以把parent的pom.xml的b…

智慧农业物联网平台建设方案

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 智慧农业物联网系统组网图 2.2.1 智能温室组网说明 该组网图演示的为小面积示范区&#xff0c;每个连栋温室为 1个灌溉区域&#xff0c;1个子系统&#xff0c;该子系统完成…

学习Typescript(第一弹)

Typescript的基础类型 Boolean类型 let bool: boolean true;Number类型 let num: number 222;String类型 let str: string 码上coding;数组Array类型 对数组类型的定义有两种方式: let arr1: number[] [1,2,3]; let arr2: Array<number | string> [1,2,码上co…