排序--归并排序

一,引言

归并排序作为七大排序中一种,本文将讲解其排序原理和代码实现。

二,逻辑讲解

来看一组动图:

首先先进行大逻辑的讲解,在一个乱序的数组中如图:

通过递归进行一次次分组如图:

分组逻辑:左右区间相加除以2,将一组分成两组,直到最后,每组只有一个数据分组结束。

因为单个数据看作为有序。

分组结束进行返回,如上图0有序,1有序,之后0和1进行排序,排完之后 0到1和2进行排序,排完之后0到2为有序,后面的逻辑都相同。如图:

这个排序的逻辑就逆着来,最小的区间有序,进而大一点的区间有序,进而更大一点区间有序,最后整个数组有序 。

下面我带入上述乱序数组进行排序。

第一步

首先如上图分成最小部分.0的位置为(5)单个看作有序,1的位置为(1)当个看作有序。将这两个返回。将0到1的位置进行排序,排序之后是(1)(5)

第二步

2的位置为(9)单个数据看作有序,进行返回,0到1的位置为有序---(1)(5),2的位置为有序---(9),将0到2进行排序。

第三步

进行排序0到4的右半边,和一二步逻辑相同。排序结束之后0到4为有序。

第四步

0到9的左半边有序,进行右半边的排序。逻辑和前三步相同,最后5到9有序。

第五步

进行0到9的排序。最终排序结束。

单趟排序逻辑:

分成最后单个有序返回之后进行[L----key]和[key+1-------R]的排序

通过创建一个新数组,将两组数据进行比较,然后依次拷贝到新数组 ,拷贝结束之后将新数组的数据拷贝回原数组。

第二步的单趟讲解:

和第一步的逻辑相同如图:

第三步的单趟排序:

第四步,第五步逻辑一致

这里就不依次画图了

三,代码实现:

cpp 复制代码
void Merge(int* p, int* q, int left, int right)
{
	if (left >= right)
	{
		return;
	}
	int begin1 = left;
	int tag = left;
	int keys = (left + right) / 2;
	int end1 = keys;
	int begin2 = keys + 1;
	int end2 = right;

	Merge(p, q, begin1, keys);
	Merge(p, q, keys + 1, end2);
	while (begin1 <= keys && begin2 <= end2)
	{
		if (p[begin1] < p[begin2])
		{
			q[tag] = p[begin1];
			begin1++;
		}
		else
		{
			q[tag] = p[begin2];
			begin2++;
		}
		tag++;

	}

	while (begin2 <= end2)
	{
		q[tag] = p[begin2];
		begin2++;
		tag++;
	}


	while (begin1 <= end1)
	{
		q[tag] = p[begin1];
		begin1++;
		tag++;
	}

	memcpy(p + left, q + left, (right - left+1) * sizeof(int));
}

p为原数组,q为拷贝数组,memcpy为拷贝函数,头文件在<string.h>中。

四,总结:

归并排序也是使用递归排序的一种,时间复杂度为O(Nlog^N)空间复杂度因为需要开辟新的空间所以为O(N),稳定性方面,在相同数据的相对数据并不会有所改变。所以该排序算法是稳定的。

相关推荐
海清河晏1111 小时前
数据结构 | 单循环链表
数据结构·算法·链表
skywalker_116 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
_日拱一卒7 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾7 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
计算机安禾7 小时前
【数据结构与算法】第35篇:归并排序与基数排序
c语言·数据结构·vscode·算法·排序算法·哈希算法·visual studio
专注API从业者7 小时前
淘宝商品详情 API 与爬虫技术的边界:合法接入与反爬策略的技术博弈
大数据·数据结构·数据库·爬虫
汀、人工智能8 小时前
[特殊字符] 第66课:跳跃游戏
数据结构·算法·数据库架构·图论·bfs·跳跃游戏
汀、人工智能8 小时前
[特殊字符] 第70课:加油站
数据结构·算法·数据库架构·图论·bfs·加油站
favour_you___8 小时前
2026_4_8算法练习题
数据结构·c++·算法
汀、人工智能8 小时前
[特殊字符] 第57课:搜索旋转排序数组
数据结构·算法·数据库架构·图论·bfs·搜索旋转排序数组