【数据结构--八大排序】之归并排序

news2024/11/20 12:44:17

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 一、什么是归并排序
  • 二、思路:
  • 三、流程图:
    • 方法一(递归法)
      • 1.代码展示:
      • 2.测试结果
    • 方法二(非递归法)
      • 1.代码:
      • 2.测试结果:
  • 四、时间复杂度

一、什么是归并排序

归并排序:是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(DivideandConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

二、思路:

第一阶段:(下图1~2)采用分治的思想,使用递归的一直向下分割。最终每个元素为一组。如下图红色虚线位置。
第二阶段:(下图2~3)开始归并,合并分割好的两个数组,将其有序的存储到tmp数组中。向上归并,继续重复此步骤.
归并思路:合并两个有序数组。
最后,由于排序好的元素一直都是存到tmp数组中的,所以最后还需将tmp拷贝到a数组中。
补充:

拷贝数组时需要用到方法memcpy;

void * memcpy ( void * destination, const void * source, size_t num );

在这里插入图片描述

三、流程图:

在这里插入图片描述

方法一(递归法)

1.代码展示:

#include<string.h>

//归并排序
void MergeSort(int* a, int* tmp, int begin, int end)
{
	//如果end <= begin结束向下递的过程。
	if (end <= begin)
		return;
	int mid = (begin + end) / 2;
	MergeSort(a, tmp, begin, mid);
	MergeSort(a, tmp, mid + 1, end);
	//走到这已经递归到头,开始回溯
	//每次都是合并两个有序数组归并到tmp数组中,最后在拷贝回a数组。
	//记录下当前坐标
	int begin1 = begin, end1 = mid;
	int begin2 = mid + 1, end2 = end;
	int i = begin;

	//依次比较两个数组的值,选择小的放入数组tmp中。
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin1] < a[begin2] )
		{
			tmp[i++] = a[begin1++];
		}
		else
		{
			tmp[i++] = a[begin2++];
		}
	}
	//如果begin1中还剩有元素,依次放入tmp中。
	while (begin1 <= end1)
	{
		tmp[i++] = a[begin1++];
	}
	//如果begin2中还剩有元素,依次放入tmp中。
	while (begin2 <= end2)
	{
		tmp[i++] = a[begin2++];
	}

	//将tmp拷贝回a数组。
	memcpy(a + begin, tmp + begin, (end - begin + 1) * sizeof(int));

}
void MergeSort(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		perror("malloc fail");
		return;
	}

	MergeSort(a, tmp, 0, n - 1);

	free(tmp);
}

2.测试结果

int main()
{
	int a[10] = { 2, 6 ,7 ,5 ,9, 3 ,4 ,1 ,0 ,8 };
	MergeSort(a, 10);
	print(a, 10);
	return 0;
}

在这里插入图片描述

方法二(非递归法)

1.代码:

void MergeSortNon(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		perror("malloc fail");
		return;
	}

	int gap = 1;
	while (gap < n)
	{
		for (int i = 0; i < n; i += 2 * gap)
		{
			int begin1 = i, end1 = i + gap - 1;
			int begin2 = i + gap, end2 = i + 2 * gap - 1;
			// [begin1,end1] [begin2,end2] 归并
			int index = i;
			while (begin1 <= end1 && begin2 <= end2)
			{
				if (a[begin1] < a[begin2])
				{
					tmp[index++] = a[begin1++];
				}
				else
				{
					tmp[index++] = a[begin2++];
				}
			}

			while (begin1 <= end1)
			{
				tmp[index++] = a[begin1++];
			}

			while (begin2 <= end2)
			{
				tmp[index++] = a[begin2++];
			}

			// 拷贝回原数组
			memcpy(a + i, tmp + i, (2 * gap) * sizeof(int));
		}
		gap *= 2;
	}

	free(tmp);
}

2.测试结果:

int main()
{
	int a[10] = { 2, 6 ,7 ,5 ,9, 3 ,4 ,1 ,0 ,8 };
	MergeSortNon(a, 10);
	print(a, 10);
	return 0;
}

在这里插入图片描述

四、时间复杂度

时间复杂度:O(N*logN)

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

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

相关文章

中国社科院与美国杜兰大学完成了我的金融硕士梦

一个人从出生就被赋予着太多的期待&#xff0c;比如爸爸妈妈从小没有完成的梦想&#xff0c;哥哥姐姐失败的课程&#xff0c;为了实现这些期待&#xff0c;人们忙着奋斗、拼搏、追逐&#xff0c;马不停蹄去做有用的事&#xff0c;结交有用的人&#xff0c;不敢虚度半寸光阴&…

第1章 数据结构绪论

1.1 开场白 1.2 你数据结构怎么学的 1.3 数据结构起源 早期人们都把计算机理解为数值计算工具&#xff0c;就是感觉计算机当然是用来计算的&#xff0c;所以计算机解决问题&#xff0c;应该是先从具体问题中抽象出一个适当的数据模型&#xff0c;设计出一个解此数据模型的算…

crypto:丢失的MD5

题目 得到一个md5.py 运行一下&#xff0c;发现报错&#xff0c;修改一下 运行之后又报错 报错原因是算法之前编码 正确的代码为 import hashlib for i in range(32,127):for j in range(32,127):for k in range(32,127):mhashlib.md5()m.update((TASC chr(i) O3RJMV c…

Makerbase SimpleFOC ESP32 例程12 双霍尔电机位置控制

Makerbase SimpleFOC ESP32 例程12 双霍尔电机位置控制 第 1 部分 硬件介绍 1.1 硬件清单 序号品名数量1MKS ESP32 FOC V1.0 主板12LA034-040NN07A 霍尔电机23DC24V电源14USB 线1 硬件清单如下图所示&#xff1a; ESP32 FOC V1.0主板说明书等更多资料请加入企鹅&#xff…

1039 到底买不买

描述 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串&#xff0c;但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下&#xff0c;某串珠子里是否包含了全部自己想要的珠子&#xff1f;如果是&#xff0c;那么告诉她有多少多余的珠子&#xff1…

对比学习的锚网络和自动生成标签

文章目录 锚网络自动生成标签&#xff08;词组&#xff09; 锚网络 在对比学习&#xff08;Contrastive Learning&#xff09;中&#xff0c;“锚网络”&#xff08;Anchor Network&#xff09;通常是指一个用于生成数据样本的表示的网络。锚网络的主要作用是将输入数据样本转…

链表入门(单链表讲)

链表 1.链表1.1 链表概念及其结构1.2 链表的分类 2.单链表代码实现2.1 单链表的定义2.2 单链表的初始化2.3 单链表的新增结点2.4 单链表的打印2.4 单链表的插入2.4.1 头插2.4.2 尾插2.4.3 任意位置插入 2.5 单链表的删除2.5.1 头删2.5.2 尾删2.5.3 任意位置删除 2.6 单链表的查…

华为网络技术基础笔记

2023-2024 一、9/81.典型拓扑2.分层架构3.流量分析4.网线 二、9/15三、9/19 一、9/8 1.典型拓扑 Topolpgy 拓扑 结构 ①总线型 ②星型 网络 要 有 “ 冗余 ”性。 ③树型 ④环型网络&#xff08;口字型网络&#xff09; ⑤全互联&#xff08;全网状&#xff09; ⑥部分网…

代码随想录 Day7 字符串1 LeetCode T344反转字符串 T541 反转字符串II 151翻转字符串的单词

本文更详细解析来自于:代码随想录 (programmercarl.com) LeetCode T344 反转字符串 链接:344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; 题目思路 这题的思路很简单,只需要创建两个指针,一个指向首字母,一个指向末字母,两两进行交换即可,这里我们要说的就是交换,可…

一个比 ping 更强大、更牛逼的命令行工具

晚上好&#xff0c;我的网工朋友。 遇到网络故障的时候&#xff0c;你一般会最先使用哪条命令进行排障&#xff1f; 基本上大家第一个想到的都是Ping吧。 但除了Ping&#xff0c;还有Traceroute、Show、Telnet又或是Clear、Debug等等好用命令&#xff0c;你都用过吗&#xf…

MD5 绕过第二式:数组绕过

文章目录 参考环境强类型比较运算符雾来哈希碰撞目标 王小云院士与白宫密码王小云院士两度破译白宫密码白宫密码亮剑十年磨一剑 雾散曲径通幽WarrningPHP 中的数组与 md5()尝试绕过PHP8 下的致命错误 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火…

正点原子lwIP学习笔记——Jperf测试网速

1. Jperf与iperf简介 iperf是命令行形式的网络性能测试工具&#xff1b;而Jperf就是在iperf的基础上进行UI开发&#xff0c;搭建了界面的图形化网络性能测试工具。 是用来测试TCP/UDP的带宽、延迟抖动和数据包丢失等功能&#xff01; iperf -c server -ip -p server-port -i 1…

解决GC毛刺问题——转转搜索推荐服务JDK17升级实践

解决GC毛刺问题——转转搜索推荐服务JDK17升级实践 1 升级背景2 JDK17简介2.1 新语法简介2.2 新GC算法简介 3 升级过程3.1 升级步骤3.2 遇到问题及解决方法 4 升级效果4.1 整体耗时对比4.2 分节点耗时对比4.3 GC停顿时长对比4.4 堆空间占用对比 5 总结 1 升级背景 随着转转业务…

HTTPS协议概述

HTTPS&#xff08;Hypertext Transfer Protocol over Secure Socket Layer&#xff0c;基于安全套接字层的超文本传输协议&#xff09;&#xff0c;是以安全为目标的HTTP通道&#xff0c;简单讲是HTTP的安全版。即HTTP下加入SSL层&#xff0c;HTTPS的安全基础是SSL&#xff0c;…

C语言入门Day_26 结构体

目录 前言&#xff1a; 1.结构体的定义 2.结构体的使用 3.易错点 4.思维导图 前言&#xff1a; 变量只能表示单一的属性&#xff0c;比如用int去表示一个年龄&#xff0c;用float去表示一个身高或一个体重&#xff0c;一个字符串/字符数组去表示一个性别或一个名字。 …

2023年腾讯云服务器优惠活动整理汇总

腾讯云是腾讯集团倾力打造的云计算品牌&#xff0c;为了吸引更多的用户&#xff0c;腾讯云经常会推出各种各样的优惠活动。本文将为大家整理汇总一些腾讯云服务器的优惠活动&#xff0c;希望能够帮助到需要购买腾讯云服务器的用户。 一、腾讯云服务器优惠券 腾讯云优惠券是腾讯…

创建型设计模式——工厂模式

摘要 本博文主要介绍软件设计模式中工厂模式&#xff0c;其中工厂设计模式的扩展为简单工厂(Simple Factory)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)三种。 一、简单工厂(Simple Factory) 主要分析设计模式 - 简单工厂(Simple Factory)&#xff0c;它把实例…

腾讯大牛耗时1个月整理的“JVM学习笔记“深入底层,面面俱到!

为什么要学习JVM&#xff1f; 1、 程序调优2、 排查程序运行问题3、 掌握了程序执行的根本和原理4、 规避写代码时候的一些错误5、 应付面试6、 掌握了其他语言的通用机制 怎么有效的学习JVM&#xff1f; 以上了解了学习JVM的种种好处&#xff0c;但是怎么有效的学习JVM呢&a…

029-从零搭建微服务-消息队列(一)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;mingyue: &#x1f389; 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…

1992-2021年省市县经过矫正的夜间灯光数据(GNLD、VIIRS)

1992-2021年省市县经过矫正的夜间灯光数据&#xff08;GNLD、VIIRS&#xff09; 1、时间&#xff1a;1992-2021年3月&#xff0c;其中1992-2013年为年度数据&#xff0c;2013-2021年3月为月度数据 2、来源&#xff1a;1992-2013年来源于DMSP、2013-2021年3月来自VIIRS 3、范…