归并排序(分治)

news2024/11/24 19:13:28

归并排序

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

概念介绍

归并排序(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.coloradmin.cn/o/1797636.html

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

相关文章

12. ESP32-JSON(Arduino)

使用ESP32和Arduino框架处理JSON数据 在物联网&#xff08;IoT&#xff09;开发中&#xff0c;ESP32是一款功能强大的微控制器&#xff0c;它结合了Wi-Fi和蓝牙功能&#xff0c;适用于各种智能设备和传感器项目。JSON&#xff08;JavaScript Object Notation&#xff09;是一种…

C++三大特性之继承,详细介绍

阿尼亚全程陪伴大家学习~ 前言 每个程序员在开发新系统时&#xff0c;都希望能够利用已有的软件资源&#xff0c;以缩短开发周期&#xff0c;提高开发效率。 为了提高软件的可重用性(reusability)&#xff0c;C提供了类的继承机制。 1.继承的概念 继承&#xff1a; 指在现有…

储能逆变器测试负载箱是如何实现的

储能逆变器测试负载箱是专门用于模拟各种负载条件的设备&#xff0c;主要用于对储能逆变器进行性能测试和评估。它可以根据实际需求&#xff0c;模拟不同的负载类型、负载大小和负载变化率&#xff0c;从而为储能逆变器的设计和优化提供准确的数据支持。那么&#xff0c;储能逆…

关于gitee上传成功没有绿点

今天上传完代码以后&#xff0c;打开gitee看了一下&#xff0c;但是看到昨天和今天都没有小绿点&#xff0c;仔细思考了一番&#xff0c;是仓库满了&#xff1f;不对啊&#xff0c;如果满了的话&#xff0c;上传就会失败啊&#xff0c;那这是什么问题呢&#xff1f; 原来是因为…

20240607在Toybrick的TB-RK3588开发板的Android12下适配IMX415摄像头和ov50c40

20240607在Toybrick的TB-RK3588开发板的Android12下适配IMX415摄像头和ov50c40 2024/6/7 11:42 【4K/8K摄像头发热量巨大&#xff0c;请做好散热措施&#xff0c;最好使用散热片鼓风机模式&#xff01;】 结论&#xff1a;欢迎您入坑。 Toybrick的TB-RK3588开发板的技术支持不…

AlaSQL.js:用SQL解锁JavaScript数据操作的魔法

简介 先附上 github 地址 https://github.com/AlaSQL/alasql AlaSQL.js - JavaScript SQL database for browser and Node.js. Handles both traditional relational tables and nested JSON data (NoSQL). Export, store, and import data from localStorage, IndexedDB, or …

从零开始学JAVA

一、编写Hello world程序 public class JavaMain1 {//主程序执行入口&#xff0c;main方法public static void main(String[] args){System.out.println("Hello world!");} } 运行结果 Hello world! java编写主程序常见错误&#xff1a; 1、System ---首字母没有…

vue2+elementui,动态生成的表单校验

话不多,先上一段视频,看看是不是你们需要的效果 elementui动态生成表单校验 附上代码 <template><div class"home"><div class"home-box"><!-- <menuHtml></menuHtml> --><div class"home-div"><…

使用2个手机文件恢复工具,轻松找回文件

在这个智能手机横行的时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。然而&#xff0c;就像生活中的一切事物一样&#xff0c;手机也有可能出现意外&#xff0c;比如文件丢失。这就像是你在超市购物&#xff0c;结果发现钱包不见了&#xff0c;那种感觉真是让人抓狂…

CTFHUB-技能树-web-web前置技能-HTTP协议全

目录 1.请求方式 2.302跳转 3.Cookie 4.基础认证 5.响应包源码 1.请求方式 curl -v -X http://challenge-3022c877a8dcedeb.sandbox.ctfhub.com:10800/index.php 2.302跳转 参考链接&#xff1a;http://t.csdnimg.cn/aqdNG 301——永久性重定向。该状态码表示请求的资源已…

攻防世界---misc---津门杯2021-m1

1、题目描述&#xff0c;下载附件是一张bmp格式的图片 2、直觉告诉我这和图片的颜色通道有关 3、于是我就尝试用stegslove打开图片 4、将颜色通道都改为0&#xff0c;点击preview 5、然后发现一串base64编码 6、解码得flag flag{l5DGqF1pPzOb2LU919LMaBYS5B1G01FD}

MyEclipse新手使用介绍

目录 1.MyEclipse诞生背景 2.作用 3.版本历史 4.优缺点 5.应用场景 6.如何使用 6.1.下载与安装 6.2.MyEclipse 菜单及其菜单项 7.创建和发布一个 Java 程序 7.1.创建 Java 程序 7.2.发布 Java 程序 8.示例 8.1. Hello World 示例 8.2. 简单Spring Boot 应用 8.3…

行心科技中禄松波携手,开启智能健康新时代

在2024年第34届健博会暨中国大健康产业文化节的盛大舞台上&#xff0c;广州市行心信息科技有限公司&#xff08;以下简称“行心科技”&#xff09;与浙江中禄松波生物工程有限公司&#xff08;以下简称“中禄松波”&#xff09;宣布达成战略合作&#xff0c;共同推动医康养产业…

【JavaEE精炼宝库】多线程(4)深度理解死锁、内存可见性、volatile关键字、wait、notify

目录 一、死锁 1.1 出现死锁的常见场景&#xff1a; 1.2 产生死锁的后果&#xff1a; 1.3 如何避免死锁&#xff1a; 二、内存可见性 2.1 由内存可见性产生的经典案例&#xff1a; 2.2 volatile 关键字&#xff1a; 2.2.1 volatile 用法&#xff1a; 2.2.2 volatile 不…

2024 年最新商家转账到零钱功能申请问题集中解答

鉴于诸多商户在申请商家转账到零钱时受到过时、错误经验文章的误导&#xff0c;基于我们数千次成功开通商家转账到零钱功能的丰富经验&#xff0c;特整理此篇文章&#xff0c;以期对新商户开通微信支付的商家转账到零钱功能提供有益帮助。以下将针对商家转账到零钱功能申请前、…

阿里云sls 采集日志安装记录

参考阿里云给的安装文档 阿里云安装Logtail组件 注意这里&#xff0c;选择地域&#xff0c;是中国地域选中国&#xff0c;海外选海外即可 按照文档继续下去 修改配置文件./alibaba-cloud-log-all/values.yaml 所有的操作完成后&#xff0c;去控制台配置 以上操作的前提是…

多目标应用:MOHHO多目标哈里斯鹰优化算法求解无人机三维路径规划(MATLAB代码)

详细介绍 多目标应用&#xff1a;MOHHO多目标哈里斯鹰优化算法求解无人机三维路径规划&#xff08;MATLAB代码&#xff09;-CSDN博客 一次运行结果 完整MATLAB代码

工会考试基础知识题库分享(附答案解析)

单选题 1、国家机关在组织起草或者修改直接涉及职工切身利益的法律、法规、规章时&#xff0c;( )工会意见。 A、可以听取 B、应当听取 C、必须听取 D、应当吸收 [答案]B 【解析】国家机关在组织起草或者修改直接涉及职工自身利益的法律、法规、规章时&#xff0c;应当听取工…

正宇软件助力青岛打造智慧政协平台,引领新时代政协工作创新

在当前数字化、智能化浪潮的推动下&#xff0c;青岛市政协紧跟时代步伐&#xff0c;以“百舸争流奋楫先”的精神&#xff0c;不断开拓创新&#xff0c;推动政协工作高质量发展。5月30日&#xff0c;人民政协报报道了青岛市政协在推动高质量发展、加强思想政治引领、凝聚合作共识…

电赛报告书写

一、总体要求 &#xff08;1&#xff09;摘要&#xff1a;一页&#xff0c;小于300字 &#xff08;2&#xff09;正文&#xff1a;不超过8页 &#xff08;3&#xff09;附录&#xff1a;可以没有&#xff0c;但是不能超过2页 二、摘要书写 摘要要小于等于300字&#xff0c…