排序--归并排序

一,引言

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

二,逻辑讲解

来看一组动图:

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

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

分组逻辑:左右区间相加除以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),稳定性方面,在相同数据的相对数据并不会有所改变。所以该排序算法是稳定的。

相关推荐
Fanxt_Ja17 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
今后12319 小时前
【数据结构】二叉树的概念
数据结构·二叉树
散1121 天前
01数据结构-01背包问题
数据结构
消失的旧时光-19431 天前
Kotlinx.serialization 使用讲解
android·数据结构·android jetpack
Gu_shiwww1 天前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
苏小瀚1 天前
[数据结构] 排序
数据结构
睡不醒的kun1 天前
leetcode算法刷题的第三十四天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
吃着火锅x唱着歌1 天前
LeetCode 978.最长湍流子数组
数据结构·算法·leetcode
Whisper_long1 天前
【数据结构】深入理解堆:概念、应用与实现
数据结构
IAtlantiscsdn1 天前
Redis7底层数据结构解析
前端·数据结构·bootstrap