当前位置: 首页 > news >正文

排序--归并排序

一,引言

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

二,逻辑讲解

来看一组动图:

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

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


 分组逻辑:左右区间相加除以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]的排序

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

第二步的单趟讲解:

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

第三步的单趟排序:

第四步,第五步逻辑一致

这里就不依次画图了

三,代码实现:
 

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),稳定性方面,在相同数据的相对数据并不会有所改变。所以该排序算法是稳定的。

相关文章:

  • Kubernetes service 基于工作原理的实验
  • IDEA 接入 Skywalking Agent ClassNotFoundException
  • 基于多二阶广义积分器的正负序谐波提取方法
  • 人体的三个 Bug
  • 全局引用,utils 目录下的文件打包并安装到系统Python环境中
  • 漏洞挖掘---迅饶科技X2Modbus网关-GetUser信息泄露漏洞
  • 基于javaweb的SSM公寓房屋出租系统设计与实现(源码+文档+部署讲解)
  • 五.ubuntu20.04 - ffmpeg推拉流以及Nginx、SRS本地部署
  • Maven 构建生命周期
  • React(六)React过渡动画-CSS编写方式
  • Altium Designer 24 PCB编辑器[设计]栏找不到[规则]选项而只有[Constraints Manager]选项
  • 【操作系统】内存泄漏 vs 内存碎片
  • 游戏开发中的贝塞尔曲线:感受丝滑的数学之美
  • UE学习记录part11
  • DHT11数字温湿度传感器驱动开发全解析(中) | 零基础入门STM32第八十七步
  • 回调后门基础
  • Day18 -实例:app信息收集工具(Appinfoscanner、Mobsf)的配置和使用
  • 从PDF到精准答案:Coze助力RAGFlow框架提升数据召回率
  • Java基本类型深度解析:从内存模型到高效编程实践
  • 【MinerU】可本地部署的PDF解析器
  • 优化前网站现状分析/上海最新发布最新
  • 怎么查看网站是否备案/深圳推广
  • 做网站怎样让字体滚动/驻马店百度seo
  • 流程图 网站/网站收录批量查询
  • 东莞集团网站建设/b2b网站平台
  • wordpress如何弄添加框/网站百度关键词优化