十大经典排序算法
  • 十大经典排序算法-冒泡排序算法详解
  • 十大经典排序算法-选择排序算法详解
  • 十大经典排序算法-插入排序算法详解
  • 十大经典排序算法-希尔排序算法详解
  • 十大经典排序算法-快速排序算法详解
  • 十大经典排序算法-归并排序算法详解
  • 十大经典排序算法-堆排序算法详解
  • 十大经典排序算法-计数排序算法详解
  • 十大经典排序算法-桶排序算法详解
  • 十大经典排序算法-基数排序算法详解

一、什么是归并排序

1.概念

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的

2.算法原理

这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序。按照归并排序的思想,我们要把序列逐层进行拆分

序列逐层拆分如下

然后从下往上逐层合并,首先对第一层序列1(只包含元素4)和序列2(只包含元素5)进行合并

创建一个大序列,序列长度为两个小序列长度之和,p1、p2指针分别指向两个小序列的第一个元素,p指向大序列的第一个元素

比较p1、p2指向的元素,4小于5,将4填入p指向的元素,p、p1往右移一位

此时,序列1已经没有元素,将序列2的元素依次填入大序列中

序列8和1,序列7和2,序列6和3,用同样的方式填入新的序列

接着,以4、5为序列1,1、8为序列2,继续进行合并

创建一个序列长度为4的大序列,p1指向序列1的第一个元素4,p2指向序列2的第一个元素1,p指向大序列的第一个元素

4和1比较,4大于1,1填入p指向的元素,p、p2往右移一位

4和8比较,4小于8,4填入p指向的元素,p、p1往右移一位

5和8比较,5小于8,5填入p指向的元素,p、p1往右移一位

自此,序列1已经没有元素,将序列2的元素依次填入大序列中

序列2、7和序列3、6以同样的方式合并成新的序列

最后,将序列1、4、5、8和序列2、3、6、7以同样的方式继续合并成新的序列

至此所有的元素都是有序的

3.算法实现

function sort(arr, startIndex = 0, endIndex = arr.length - 1) {// 递归结束条件:startIndex大于等于endIndex的时候if (startIndex >= endIndex) {return;}// 折半递归let midIndex = parseInt((startIndex + endIndex) / 2);sort(arr, startIndex, midIndex);sort(arr, midIndex + 1, endIndex);// 将两个有序的小数组,合并成一个大数组merge(arr, startIndex, midIndex, endIndex);
}function merge(arr, startIndex, midIndex, endIndex) {// 新建一个大数组let tempArr = [];let p1 = startIndex;let p2 = midIndex + 1;let p = 0;// 比较两个有序小数组的元素,依次放入大数组中while (p1 <= midIndex && p2 <= endIndex) {if (arr[p1] <= arr[p2]) {tempArr[p++] = arr[p1++];} else {tempArr[p++] = arr[p2++];}}// 右侧小数组已排序完毕,左侧小数组还有剩余,将左侧小数组元素依次放入大数组尾部while (p1 <= midIndex) {tempArr[p++] = arr[p1++];}// 左侧小数组已排序完毕,右侧小数组还有剩余,将右侧小数组元素依次放入大数组尾部while (p2 <= endIndex) {tempArr[p++] = arr[p2++];}for (let i = 0; i < tempArr.length; i++) {arr[i + startIndex] = tempArr[i];}
}let arr = [4, 5, 8, 1, 7, 2, 6, 3];
sort(arr);
console.log(arr);

二、归并排序算法特点

1.时间复杂度

归并排序算法每次将序列折半分组,共需要logn轮,因此归并排序算法的时间复杂度是O(nlogn)

2.空间复杂度

归并排序算法排序过程中需要额外的一个序列去存储排序后的结果,所占空间是n,因此空间复杂度为O(n)

3.稳定性

归并排序算法在排序过程中,相同元素的前后顺序并没有改变,所以归并排序是一种稳定排序算法


另外推荐一个开发者小工具网站,个人觉得里面的Json格式化功能很强大,报错很详细

https://tinyutil.com/

还可以输入表达式进行内容选取,对于复杂json非常多层级的内容展现非常用用处

十大经典排序算法-归并排序算法详解相关推荐

  1. 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...

  2. 十大经典排序算法-桶排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  3. 十大经典排序算法-快速排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  4. 十大经典排序算法-选择排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  5. 十大经典排序算法详解

    本文转自 <卢明冬的博客> 文章目录 排序算法的分析和评价 2.十大排序经典算法总览 2.1 排序算法的分类 2.2 排序算法的性能 2.3 各阶复杂度性能对比 2.4 排序算法的初始状态 ...

  6. 十大经典排序算法-希尔排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  7. 十大经典排序算法-冒泡排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  8. 【完整可运行源码+GIF动画演示】十大经典排序算法系列——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    以前也零零碎碎发过一些排序算法,但总是不系统, 这次彻底的对排序系列做了一个整体的规划, 小伙伴们快快mark哦~ [GIF动画+完整可运行源代码]C++实现 冒泡排序--十大经典排序算法之一 [GI ...

  9. 【GIF动画+完整可运行源代码】C++实现 归并排序——十大经典排序算法之五

    十大经典排序算法系列博客-->传送门 简介:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,是采用分治法Divide and Conquer的一个非常典型的应用.分Divide: ...

最新文章

  1. 集合list set Map问题
  2. header中的参数讲解
  3. Omi框架学习之旅 - 插件机制之omi-finger 及原理说明
  4. GDCM:DICOM文件转换为QImage文件的测试程序
  5. hibernate笔记--缓存机制之 一级缓存(session缓存)
  6. Maven环境搭配及继承
  7. [渝粤教育] 中国地质大学 数据结构 复习题 (2)
  8. matlab时频分析工具箱安装_EEG时频分析介绍与实现(基于EEGLAB、NetStation与Analyzer2软件)...
  9. php能实现前台的页面吗,thinkphp 能实现前台后台登录吗?
  10. mqadmin命令运行出错
  11. 依图要修AI语音双学位,左手摸底考第一名成绩单,右手开放平台方案
  12. JVM初识之虚拟机内存结构
  13. 国税报表html,国税纳税申报表在哪里打印
  14. 3S基础知识:MapInfo教程--二次开发入门
  15. 001_ucGUI/emWin字体制作(FontCvt.exe)
  16. Windows 11 新功能 Microsoft Teams
  17. maven pom.xml解析、命令说明、依赖传递、继承、聚合、properties、build、依赖范围、版本仲裁、profile
  18. 云脉H5文档管理系统之文件管理的共享与协作
  19. Java脚本写的随机验证码
  20. Hackshanghai 黑马

热门文章

  1. matlab并行计算实例,Matlab并行计算示例(一)
  2. c#测试网络是否联通
  3. 关于在Pycharm中导入自定义第三方文件后报错:ModuleNotFoundError: No module named
  4. 冰冰学习笔记:位图与布隆过滤器
  5. java计算机毕业设计个人收支管理系统源码+mysql数据库+系统+lw文档+部署
  6. Fre:又一个小而美的前端MVVM框架 1
  7. Ubuntu用nginx部署html项目
  8. 过桥问题(Java递归)
  9. maven 设置jdk版本 使用阿里云的MAVEN
  10. antdPro动态路由