归并算法详细解析

归并排序

1945年,约翰·冯·诺依曼(John von Neumann)发明了归并排序,这是典型的分治算法的应用。归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

基本思想

归并排序是使用分治算法,就是把序列分成长度相同的两个子序列,当无法继续往下分时(也就是每个子序列中只有一个数据时),就对子序列进行归并。归并指的是把两个排好序的子序列合并成一个有序序列。该操作会一直重复执行,直到所有子序列都归并为一个整体为止。

图形演示

为方便查看,我们用不同高度来表示不同的数字大小
在这里插入图片描述

  1. 首先我们把序列逐层对半分割

    在这里插入图片描述

直至不能再分割为止
在这里插入图片描述

  1. 分割完毕,接下来对每组元素进行合并;合并时需要将数字按照从小到大的顺序排列:
    在这里插入图片描述

每次合并时比较两个子序列的首位数字。当合并有多个数字的子序列时,要先比较首位数字,再移动较小的数字:由于3<4,所以要先移动3,接下来再比较4和7;4<7,所以移动4,再比较6和7…如此往复,左半个序列就排序好啦
在这里插入图片描述

右边也是如此,直至所有的数字都合并为一个整体为止
在这里插入图片描述

合并完成,序列的排序也就完成了

时间复杂度分析

​ 归并排序中,分割序列所花费的时间不算在运行时间内(可以当作序列本来就是分 割好的)。在合并两个已排好序的子序列时,只需重复比较首位数据的大小,然后移动较 小的数据,因此只需花费和两个子序列的长度相应的运行时间。也就是说,完成一行归 并所需的运行时间取决于这一行的数据量。 看一下上面的图便能得知,无论哪一行都是 n 个数据,所以每行的运行时间都为 O(n)。 而将长度为 n 的序列对半分割直到只有一个数据为止时,可以分成 log2n 行,因此,总 共有 log2n 行。也就是说,总的运行时间为 O(nlogn),这与前面讲到的堆排序相同。

代码实现

迭代法

public static void merge_sort(int[] arr) {int len = arr.length;int[] result = new int[len];int block, start;for(block = 1; block < len*2; block *= 2) {for(start = 0; start <len; start += 2 * block) {int low = start;int mid = (start + block) < len ? (start + block) : len;int high = (start + 2 * block) < len ? (start + 2 * block) : len;int start1 = low, end1 = mid;int start2 = mid, end2 = high;while (start1 < end1 && start2 < end2) {result[low++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];}while(start1 < end1) {result[low++] = arr[start1++];}while(start2 < end2) {result[low++] = arr[start2++];}}int[] temp = arr;arr = result;result = temp;}result = arr;       
}

递归法

static void merge_sort_recursive(int[] arr, int[] result, int start, int end) {if (start >= end)return;int len = end - start, mid = (len >> 1) + start;int start1 = start, end1 = mid;int start2 = mid + 1, end2 = end;merge_sort_recursive(arr, result, start1, end1);merge_sort_recursive(arr, result, start2, end2);int k = start;while (start1 <= end1 && start2 <= end2)result[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];while (start1 <= end1)result[k++] = arr[start1++];while (start2 <= end2)result[k++] = arr[start2++];for (k = start; k <= end; k++)arr[k] = result[k];
}public static void merge_sort(int[] arr) {int len = arr.length;int[] result = new int[len];merge_sort_recursive(arr, result, 0, len - 1);
}

总结

​ 归并排序与选择排序一样,性能不受输入数据的影响,但时间复杂度远小于选择排序。但由于归并排序需要另外一个与原数组长度相同的数组来做辅助排序,需要占用额外的空间,空间复杂度为O(n);

参考资料:《我的第一本算法书》

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

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

相关文章

数学建模(Topsis python代码 案例)

目录 介绍&#xff1a; 模板&#xff1a; 案例&#xff1a; 极小型指标转化为极大型&#xff08;正向化&#xff09;&#xff1a; 中间型指标转为极大型&#xff08;正向化&#xff09;&#xff1a; 区间型指标转为极大型&#xff08;正向化&#xff09;&#xff1a; 标…

在Java中使用Apache POI保留Excel样式合并多个工作簿

背景 在日常工作中&#xff0c;我们经常需要将多个Excel文件合并成一个&#xff0c;同时保留原有的样式和格式。Apache POI是一个流行的Java库&#xff0c;用于读取和写入Microsoft Office格式的文件&#xff0c;包括Excel。然而&#xff0c;仅仅使用Apache POI的基本功能进行…

RequestResponse使用

文章目录 一、Request&Response介绍二、Request 继承体系三、Request 获取请求数据1、获取请求数据方法&#xff08;1&#xff09;、请求行&#xff08;2&#xff09;、请求头&#xff08;3&#xff09;、请求体 2、通过方式获取请求参数3、IDEA模板创建Servlet4、请求参数…

WEB 表单练习题

任务如图&#xff1a; <html><head><meta charest"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head><body><table width"…

第二十八章 配置 Web Gateway 的默认参数 - 与 IRIS 的连接

文章目录 第二十八章 配置 Web Gateway 的默认参数 - 与 InterSystems IRIS 的连接(一)与 IRIS 的连接Server Response TimeoutQueued Request TimeoutNo Activity TimeoutApply timeout to all ConnectionsEvent Log LevelEvent Log FileRetain All Log Files 第二十八章 配置…

Apache Commons-Configuration2 堆栈溢出漏洞复现 (CVE-2024-29131)

免责声明 由于传播、利用本CSDN所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担! 一、产品介绍 Apache Commons Configuration2 是 Apache Commons 组件库中的一个项目,用于处理配置文件的读取、解…

Google的MELON: 通过未定位图像重建精确3D模型的突破性算法

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

算法沉淀——贪心算法七(leetcode真题剖析)

算法沉淀——贪心算法七 01.整数替换02.俄罗斯套娃信封问题03.可被三整除的最大和04.距离相等的条形码05.重构字符串 01.整数替换 题目链接&#xff1a;https://leetcode.cn/problems/integer-replacement/ 给定一个正整数 n &#xff0c;你可以做如下操作&#xff1a; 如果…

数据结构:堆的创建和使用

上一期我们学习了树和二叉树的定义&#xff0c;其中我们了解到了两种特殊的二叉树&#xff1a;满二叉树和完全二叉树。 今天我们还要学习一种新的结构&#xff1a;堆 那这种结构和二叉树有什么联系呢&#xff1f;&#xff1f;&#xff1f; 通过观察我们可以发现&#xff0c;…

什么是通用人工智能(AGI)以及为什么它还没有到来:给AI爱好者的现实检查

人工智能通用智能(AGI)及其现状&#xff1a;AI爱好者的现实检验 引言 人工智能(AI)已经无处不在。从智能助手到自动驾驶汽车&#xff0c;AI系统正在改变我们的生活和商业。但是&#xff0c;如果有一种AI能够超越执行特定任务的能力呢&#xff1f;如果有一种AI能够像人类一样学…

pytorch之torch.save()和torch.load()方法详细说明

torch.save()和torch.load()是PyTorch中用于模型保存和加载的函数。它们提供了一种方便的方式来保存和恢复模型的状态、结构和参数。可以使用它们来保存和加载整个模型或其他任意的Python对象&#xff0c;并且可以在加载模型时指定目标设备。 1.语法介绍 1.1 torch.save()语法…

uni-app开发---4.首页

一、创建 home 分支 运行如下的命令&#xff0c;基于 master 分支在本地创建 home 子分支&#xff0c;用来开发和 home 首页相关的功能&#xff1a; git checkout -b home 二、配置网络请求 由于平台的限制&#xff0c;小程序项目中不支持 axios&#xff0c;而且原生…

ARM-UART实验

串口控制三盏灯亮灭 视频 串口实验验证.mp4 代码 uart4.c #include "uart4.h"void uart4_init() {//使能GPIOB GPIOG UART4外设时钟RCC->MP_AHB4ENSETR | (0x1<<1);//GPIOBRCC->MP_AHB4ENSETR | (0x1<<6);//GPIOGRCC->MP_APB1ENSETR | (0X…

鸿蒙一次开发,多端部署(三)应用UX设计原则

设计原则 当为多种不同的设备开发应用时&#xff0c;有如下设计原则&#xff1a; 差异性 充分了解所要支持的设备&#xff0c;包括屏幕尺寸、交互方式、使用场景、用户人群等&#xff0c;对设备的特性进行针对性的设计。 一致性 除了要考虑每个设备的特性外&#xff0c;还…

SOCKS5代理、代理IP、HTTP与网络安全的融合之旅

在数字化世界的无边网络海洋中&#xff0c;数据以难以想象的速度流动&#xff0c;连接着世界的每一个角落。作为一名软件工程师&#xff0c;深入理解网络通信的基石——SOCKS5代理、代理IP、HTTP协议&#xff0c;并掌握这些技术在网络安全中的应用&#xff0c;是航行于这片海洋…

C# 读取二维数组集合输出到Word预设表格

目录 应用场景 设计约定 范例运行环境 配置Office DCOM 实现代码 组件库引入 核心代码 DataSet转二维数组 导出写入WORD表格 调用举例 小结 应用场景 存储或导出个人WORD版简历是招聘应用系统中的常用功能&#xff0c;我们通常会通过应用系统采集用户的个人简历信息…

android recyclerview 总结

面试官问我熟不熟 recyclerview&#xff0c;我说不熟 他就没再继续问&#xff0c;整个过程还是比较丝滑的 呵呵&#xff1f;&#xff1f;这么一个基础控件&#xff0c;你居然敢说不熟&#xff0c;真没想到 1 recyclerview相比listview的区别 1.1 ViewHolder 的编写规范化了 …

云主机搭建与服务软件部署

文章目录 登录访问云电脑与云电脑传输文件配置ssh服务ssh连接云电脑使用scp传输文件云端服务软件部署与实现外部访问首先购买云主机,以阿里云服务器 ECS为例子,官网购买就行了,选择默认安装了windows server 2022服务器系统 登录访问云电脑 购买完成进入控制台,能看到创建…

蓝桥杯第十三届蓝桥杯大赛软件赛决赛CC++ 研究生组之选素数

蓝桥杯第十三届蓝桥杯大赛软件赛决赛C/C 研究生组之选素数 [题目传送门](0选素数 - 蓝桥云课 (lanqiao.cn)) 问题大意&#xff1a; 小蓝有一个数字&#xff0c;要进行如下操作&#xff1a; 首先选出一个小于x 的质数p&#xff0c;然后将x变成要比原本大的最小的为p的倍数的…

js判断字符串是否为JSON格式

使用场景&#xff1a;在有些项目中我们会将用户输入的JSON字符串转化为对象形式并展示出来&#xff0c;那么首先我们就要判断一个字符串是否为一个合法的JSON字符串。 代码如下&#xff1a; isJSON(str) { if (typeof str string) { try { let obj …