归并排序(分治)

归并排序

  • 概念介绍
    • 原理解释:
    • 案例步骤:
    • 稳定性:
    • 画图理解如下
  • 代码实现

概念介绍

归并排序(Merge Sort)是一种经典的排序算法,基于分治的思想,它将待排序数组分成两个子数组,分别排序,然后合并这两个已排序的子数组以得到最终的排序结果。下面详细解释一下归并排序的原理,并提供一个案例步骤:

原理解释:

  • 分治策略:首先将待排序数组分成两个较小的子数组,然后递归地对这两个子数组进行排序。这个过程一直持续到子数组的长度为 1,此时认为它们已经排好序。

  • 合并操作:将两个已排序的子数组合并成一个有序数组。这一步骤利用了两个已排序数组的有序性,通过比较两个数组的第一个元素,将较小的元素放入结果数组中,并向后移动相应指针。

  • 递归:归并排序的关键在于递归地将数组分成较小的部分,并对这些部分进行排序,最后再合并起来。递归的基本情况是当数组长度为 1 时,即认为它是有序的。

案例步骤:

1,假设我们有一个待排序数组 [38, 27, 43, 3, 9, 82, 10]。

2,拆分:首先将数组分成两半,得到 [38, 27, 43, 3] 和 [9, 82, 10]。

3,递归排序:分别对这两个子数组进行递归排序。对于 [38, 27, 43, 3],继续拆分为 [38, 27] 和 [43, 3],然后再拆分为 [38]、[27]、[43] 和 [3]。递归结束后,得到 [3, 27, 38, 43]。对于 [9, 82, 10],继续拆分为 [9]、[82] 和 [10],递归结束后,得到 [9, 10, 82]。

4,合并:将两个有序的子数组 [3, 27, 38, 43] 和 [9, 10, 82] 合并成一个有序数组。比较两个数组的第一个元素,取较小的放入结果数组中,然后移动相应指针。依次进行下去,直到一个子数组为空,将另一个子数组中的剩余元素依次放入结果数组中。

5,合并结果:得到最终的有序数组 [3, 9, 10, 27, 38, 43, 82]。

这就是归并排序的详细原理和案例步骤。它的时间复杂度为 O(nlogn),空间复杂度为 O(n),具有稳定性。

稳定性:

稳定性是指当有两个相等的元素在排序后的序列中相对位置不发生变化。换句话说,如果排序算法能够保持相等元素的相对顺序不变,那么它就是稳定的。

例如,考虑一个包含相等元素的数组 [2b, 1, 2a],其中元素 2a 和 2b 的值相等。如果一个排序算法是稳定的,那么在排序后的序列中,元素 2a 和 2b 的相对位置应该与排序之前保持一致。如果排序算法是不稳定的,则无法保证这一点,可能会导致相等元素的相对顺序发生变化。

稳定性在某些场景下非常重要,特别是当需要按照多个条件进行排序时。在这种情况下,如果排序算法是稳定的,就可以先按照第一个条件进行排序,然后再按照第二个条件进行排序,而不会破坏第一个条件的排序结果。

归并排序是一种稳定的排序算法,因为它在合并过程中,对于相等的元素会保持它们原来的相对顺序。

画图理解如下

上分,下治
在这里插入图片描述

代码实现

需要一个辅助数组来实现,先分在按照合并有序数组的方法合并
void _mergesort(int* arr, int left, int right,int* tem)
{
	if (right - left <= 0 || arr == NULL)
	{
		return;
	}
	int mid = (right + left) >> 1;

	_mergesort(arr, left, mid,tem);
	_mergesort(arr, mid + 1, right,tem);

	int sta1 = left, end1 = mid;

	int sta2 = mid + 1, end2 = right;

	int index = left;

	while (sta1 <= end1 && sta2 <= end2)
	{
		if (arr[sta1] < arr[sta2])
		{
			tem[index++] = arr[sta1];
			sta1++;
		}
		else
		{
			tem[index++] = arr[sta2];
			sta2++;
		}
	}

	while (sta1 <= end1)
	{
		tem[index++] = arr[sta1++];
	}
	while (sta2 <= end2)
	{
		tem[index++] = arr[sta2++];
	}

	for (int i = left; i <= right; i++)
	{
		arr[i] = tem[i];
	}
}

void mergesort(int* arr, int n)
{
	int* tem = (int*)malloc(sizeof(int) * n);
	_mergesort(arr, 0, n - 1, tem);
	free(tem);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Python+django购物商城系统设计和实现(源码+LW+部署文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

iPhone的5G设置怎么更改吗?设置好这些能够优化电池的使用寿命

随着5G技术的普及&#xff0c;iPhone用户现在可以享受到更快的网络速度&#xff0c;但这同时也带来了一个问题&#xff1a;如何在使用5G和保持电池寿命之间找到平衡&#xff1f;苹果公司通过引入“5G Auto”设置&#xff0c;为用户提供了一个智能的解决方案&#xff0c;但用户也…

3D模型轻量化:无损精度和细节,轻量化处理3D模型的云原生工具

随着科技的不断发展&#xff0c;三维模型在各个领域的应用愈加广泛。然而&#xff0c;传统的CAD工具生成的模型往往包含大量的面片和数据&#xff0c;这在进行模型查看、分享、协作以及在线展示时带来了诸多不便。模型文件过大不仅导致传输速度慢&#xff0c;还可能因为文件格式…

移远通信携手高通,共启智能出行新时代

5月30-31日&#xff0c;2024高通汽车技术与合作峰会在无锡国际会议中心举行。作为高通“汽车朋友圈”的重要一员&#xff0c;移远通信应邀参会&#xff0c;展示了数十款基于高通平台打造的车载蜂窝通信模组、C-V2X模组、智能座舱模组、Wi-Fi/蓝牙模组&#xff0c;适配高通多个平…

「实战应用」如何用图表控件LightningChart JS创建SQL仪表板应用(一)

LightningChart JS是Web上性能特高的图表库&#xff0c;具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用&#xff0c;从而实现高刷新率和流畅的动画&#xff0c;常用于贸易&#xff0c;工程&#xff0c;航…

c++ - priority_queue使用和模拟实现

文章目录 一、priority_queue接口使用二、 priority_queue模拟实现三、模拟代码总览 一、priority_queue接口使用 1、函数接口与作用 接口作用priority_queue< T >构造一个空优先队列priority_queue< T >(迭代区间)通过迭代区间构造一个优先队列push(val)val入队…

计算机视觉与模式识别实验2-1 角点检测算法(Harris,SUSAN,Moravec)

文章目录 &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1;Harris算法SUSAN算法Moravec算法 &#x1f9e1;&#x1f9e1;全部代码&#x1f9e1;&#x1f9e1; &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1; Harris算法 Harris算法实现步骤&…

数据容器的通用操作、字符串大小比较 总结完毕!

1.数据容器的通用操作 1&#xff09;五类数据容器是否都支持while循环/for循环 五类数据容器都支持for循环遍历 列表、元组、字符串都支持while循环&#xff0c;集合、字典不支持&#xff08;无法下标索引&#xff09; 尽管遍历的形式不同&#xff0c;但都支持遍历操作 2&a…

在电脑端实现多个微信同时登录[使用bat脚本登录]

在电脑端实现多个微信同时登录[使用bat脚本登录] 我认为工作和生活应该分开进行&#xff0c;但往往不尽人意。 第一步&#xff0c;找到微信启动程序地址。 第二步 创建txt文本&#xff0c;写入start 你的微信启动程序地址。 start D:\微信文件\WeChat\WeChat.exe start D:\微…

The First项目报告:一场由社区驱动的去中心化加密冒险—Turbo

2023年3月14日&#xff0c;由OpenAI公司开发自回归语言模型GPT-4发布上线&#xff0c;一时之间引发AI智能领域的轩然大波&#xff0c;同时受到影响的还有加密行业&#xff0c;一众AI代币纷纷出现大幅度拉升。与此同时&#xff0c;一款名为Turbo的Meme代币出现在市场中&#xff…

在美育浸润中成长 ——中山市光后中心小学张峻皓书画作品毕业汇报展成功举办

5 月 30 号下午 3 点&#xff0c;“在美育浸润中成长——广东省中山市光后中心小学张峻皓书画作品毕业汇报展”在中山市三乡镇光后中心小学成功举行&#xff0c;本次共展出张峻皓同学近期创作书法、国画及陶瓷作品共计78幅。 广东省中山市文联兼职副主席、中山市书法家协会主席…

【距离四六级只剩一个星期!】刘晓艳四级保命班课程笔记(1)(可分享治资料~)

大家好&#xff01;距离四级考试也就只剩下一个星期左右了&#x1f635;‍&#x1f4ab;。我也是时候好好补一补四级了&#xff0c;总不能还是不过吧&#x1f62d;&#xff08;已经考了两次了&#xff09;&#xff0c;这次我一定过过过过过过&#xff0c;大家也一定要过&#x…

若依前后端分离Spring Security新增手机号登录

备忘贴 转自&#xff1a;【若依RuoYi短信验证码登录】汇总_数据库_z_xiao_qiang-RuoYi 若依 配置Security: 按照Security的流程图可知&#xff0c;实现多种方式登录&#xff0c;只需要重写三个主要的组件&#xff0c;第一个用户认证处理过滤器&#xff0c;第二个用户认证tok…

Linux Shell脚本编写指南

大家好&#xff0c;在当今快节奏的科技时代&#xff0c;自动化和高效的工作流程对于个人和组织来说变得愈发重要。而Shell脚本编写作为一种强大且广泛应用的技能&#xff0c;成为了实现自动化任务和系统管理的利器。通过编写Shell脚本&#xff0c;我们可以将繁琐的重复任务自动…

【Matplotlib作图-4.Distribution】50 Matplotlib Visualizations, Python实现,源码可复现

目录 04 Distribution 4.0 Prerequisite 4.1 连续变量的直方图(Histogram for Continuous Variable) 4.2 分类变量的直方图(Histogram for Categorical Variable) 4.3 Density Plot 4.4 Density Curves with Histogram 4.5 Joy Plot 4.6 Distributed Dot Plot 4.7 Box P…

前端 video 实现全屏播放

只需要加上这句代码就行 controls <videoid"myVideo":src"detailDate.linkAddress":poster"detailDate.pictureUrl"enable-danmucontrolswebkit-playsinline"true"></video>

绘画参数配置及使用

绘画参数配置及使用 路径&#xff1a;站点后台-功能-AI绘画 进入参数配置 接口选择&#xff1a;多种接口自主选择&#xff08;需自己准备key&#xff09;&#xff0c;对应接口的key对话和绘画通用 存储空间&#xff1a; 位置在超管后台-存储空间 自主选择存储&#xff08;需…

【STL源码剖析】deque 的使用

别院深深夏席清&#xff0c;石榴开遍透帘明。 树阴满地日当午&#xff0c;梦觉流莺时一声。 目录 deque 的结构 deque 的迭代器剖析 deque 的使用 ​编辑 deque 的初始化 deque 的容量操作 deque 的访问操作 在 pos 位置插入另一个向量的 [forst&#xff0c;last] 间的数据​编…

JVMの堆、栈内存存储

1、JVM栈的数据存储 通过前面的学习&#xff0c;我们知道&#xff0c;将源代码编译成字节码文件后&#xff0c;JVM会对其中的字节码指令解释执行&#xff0c;在解释执行的过程中&#xff0c;又利用到了栈区的操作数栈和局部变量表两部分。 而局部变量表又分为一个个的槽位&…

web安全基础学习笔记

这里写目录标题 1.使用hackbar2.php漏洞基本分析 弱类型语言2.2 php漏洞找到隐藏的源代码之 index.php~2.3 php漏洞找到隐藏的源代码之 vim的临时文件 /.index.php.swp3.php漏洞基本分析 数组 3.php漏洞基本分析 extract4.php漏洞基本分析 strpos eregi函数漏洞4.php漏洞基本分…