归并排序算法详细图解_归并排序算法详解

归并排序算法详细图解_归并排序算法详解一、什么是归并排序1.概念归并排序(Mergesort)是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的2.算法原理这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序。按照归并排序的思想,我们要把序列逐层进行拆分序列逐层拆分如下然后从下往上逐层合并,首先对第一层序列1(只包含元素4)和序列2(只包含元素5)进行合并创建一个大序列,序列长度为两个小序列长度

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

十大经典排序算法

一、什么是归并排序

1.概念

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

2.算法原理

这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序。按照归并排序的思想,我们要把序列逐层进行拆分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WPmtncWG-1592551094225)(./快速1.png)]
序列逐层拆分如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nvJMNUvk-1592551094228)(./归并1.png)]
然后从下往上逐层合并,首先对第一层序列1(只包含元素4)和序列2(只包含元素5)进行合并

创建一个大序列,序列长度为两个小序列长度之和,p1、p2指针分别指向两个小序列的第一个元素,p指向大序列的第一个元素
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oHexl6py-1592551094230)(./归并2.png)]
比较p1、p2指向的元素,4小于5,将4填入p指向的元素,p、p1往右移一位
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-51zK7Ns2-1592551094231)(./归并3.png)]
此时,序列1已经没有元素,将序列2的元素依次填入大序列中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3QMWsy0X-1592551094232)(./归并4.png)]
序列8和1,序列7和2,序列6和3,用同样的方式填入新的序列
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rWPH114Z-1592551094235)(./归并5.png)]
接着,以4、5为序列1,1、8为序列2,继续进行合并

创建一个序列长度为4的大序列,p1指向序列1的第一个元素4,p2指向序列2的第一个元素1,p指向大序列的第一个元素
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oNDu9TdZ-1592551094236)(./归并6.png)]
4和1比较,4大于1,1填入p指向的元素,p、p2往右移一位
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nnIhGQnf-1592551094237)(./归并7.png)]
4和8比较,4小于8,4填入p指向的元素,p、p1往右移一位
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YQxfZV0b-1592551094239)(./归并8.png)]
5和8比较,5小于8,5填入p指向的元素,p、p1往右移一位
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wFyyXNrc-1592551094240)(./归并9.png)]
自此,序列1已经没有元素,将序列2的元素依次填入大序列中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kiyj3tbz-1592551094241)(./归并10.png)]
序列2、7和序列3、6以同样的方式合并成新的序列
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u26c0pOr-1592551094244)(./归并11.png)]
最后,将序列1、4、5、8和序列2、3、6、7以同样的方式继续合并成新的序列
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tK2Rw29s-1592551094245)(./归并12.png)]
至此所有的元素都是有序的

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非常多层级的内容展现非常用用处
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179929.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微服务架构-实现技术之具体实现工具与框架8:Spring Cloud Config原理与注意事项

    目录注:主要只做理论性的总结与分析,相关实战代码会在后面的博客中和github中逐步增加。一、配置中心的由来及选择(一)配置中心由来(二)配置中心要求具备的功能(三)配置中心基本流转图和支撑体系分析​(四)多种配置中心的选择与对比方案二、SpringCloudConfig概述及基本实现方法介绍三、SpringClo…

    2022年4月6日
    50
  • WINDOWS下安装系统_在Windows环境下

    WINDOWS下安装系统_在Windows环境下PyTorch简介在2017年1月18日,facebook下的Torch7团队宣布PyTorch开源后就引来了剧烈的反响。PyTorch是Torch在Python上的衍生版本。Torch是一个使用Lua语言的神经网络库,Torch很好用,但是Lua流行度不够,所以facebook开发团队将Lua的Torch移植到了更流行的语言Python上,推出了PyTo…

    2022年9月27日
    2
  • CSP-J2011模拟赛#3—-考试总结

    CSP-J2011模拟赛#3—-考试总结​​​​​T1-面试说起这道题其实我刚看到的时候感觉挺简单的——但不得不说木有事情是绝对的;我看到一个0分时我蒙了。错因(挺可悲):没清空计数器加上一个a=b=c=d=0后一百分拿到手。不得不说细节决定成败-;反思:注意严谨做题,注意细节(例如:清空计数器)​​​​​T2-Excel计数器思路:刚看到这道题的时候几乎没有思路(大概我太菜了)。盲点主要集中在不会把数字转成字母以下klz大佬的方法(看懂了)——先用一个数​​​​​组把A-Z存起来,接着用一个while数…

    2025年11月4日
    3
  • android scaleanimation动画,Android 的ScaleAnimation 缩放动画基本运用

    android scaleanimation动画,Android 的ScaleAnimation 缩放动画基本运用因为今天用到了ScaleAnimation缩放动画就写一下,加深一下印象。用ScaleAnimation有几个重载方法,这里就将八个参数的重载方法。ScaleAnimation(floatfromX,floattoX,floatfromY,floattoY,intpivotXType,floatpivotXValue,intpivotYType,floatpivotYV…

    2022年10月16日
    2
  • 大学生申请软件著作权有什么用_软件著作权 申请

    大学生申请软件著作权有什么用_软件著作权 申请title:在校大学生如何申请软件著作权(超级详细)文章目录title:在校大学生如何申请软件著作权(超级详细)一、前言二、网上申请步骤:(1)打开中国版权保护中心网站(2)点击网站右上方注册/登录按钮(3)进行网上申请登记软件著作权三、材料准备(1)申请表(2)完整文档一份(3)合作开发协议书(4)软件源码(5)身份证复印件以及事业单位法人证书(6)学校公章和事业单位法人证书的获取办法四…

    2022年9月22日
    1
  • 证书签名

    证书签名一、数字签名(digitalsignature)对指定信息使用哈希算法,得到一个固定长度的信息摘要,然后再使用私钥(注意必须是私钥)对该摘要加密,就得到了数字签名。所谓的代码签名就是这个意思。二、数字证书(digitalcertificate)证书生成开发者在申请iOS开发证书时,需要通过keychain生成一个CSR文件(CertificateSigningReque

    2022年4月28日
    79

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号