首页 > 其他分享 >23--归并排序

23--归并排序

时间:2024-03-31 23:30:46浏览次数:20  
标签:归并 下标 23 -- len gap int low2

 算法描述:就是将两个有序的合并为一个较大的有序的,直到完全有序为止,也称为2路归并。

其时间复杂度是O(nlog_{2}^{}\textrm{n}),空间复杂度是O(n),并且稳定。

代码如下:

#include<stdio.h>
#include<malloc.h>
#include<assert.h>

//一趟归并(自己使用,用static),一趟归并的时间复杂度为O(n)
//gap:归并段的长度,因为l1,h1,l2,h2跟归并段的长度都有关系
static void Merge(int* arr, int len, int  gap)
{
	int low1 = 0;//第一个归并段的起始下标
	int high1 = low1 + gap - 1;//第一个归并段的结束下标
	int low2 = high1 + 1;//第二个归并段的起始下标
	int high2 = low2 + gap < len ? low2 + gap - 1 : len - 1;//第二个归并段的结束下标

	//总是比较l1和l2的值

	//准备工作
	//存放归并好的数据,动态申请空间
	int* brr = (int*)malloc(len * sizeof(int));
	//断言brr不为空
	assert(brr != NULL);

	int i = 0;//brr下标

	//有两个归并段,进行归并
	while (low2 < len)
	{
		//两个归并段都有数据,需要比较l1和l2,谁小谁下来
		while (low1 <= high1 && low2 <= high2)
		{
			if (arr[low1] <= arr[low2])
			{
				brr[i++] = arr[low1++];
			}
			else 
			{
				brr[i++] = arr[low2++];
			}
		}

		//一个归并段的数据已经完成了,另一个还有数据直接拉下来
		while (low1 <= high1)
		{
			brr[i++] = arr[low1++];
		}
		while (low2 <= high2)
		{
			brr[i++] = arr[low2++];
		}

		//下两个归并段
		low1 = high2 + 1;
		high1 = low1 + gap - 1;//high1可能越界,但一越界就从上面while循环出来了,况且下面也没有用high1进行判断
		low2 = high1 + 1;
		high2 = low2 + gap < len ? low2 + gap - 1 : len - 1;
		//high2 = low2 + gap - 1 < len - 1 ? low2 + gap - 1 : len - 1;
	}

	//从上面while循环出来即只有一个归并段
	//只有一个归并段,直接挪下来
	while (low1<len)
	{
		brr[i++] = arr[low1++];
	}

	//将归并好的数据拷贝到arr中
	for (i = 0; i < len; i++)
	{
		arr[i] = brr[i];
	}

	//释放内存
	free(brr);

}

//归并排序 O(nlog2n),O(n),稳定
void MergeSort(int* arr, int len)
{
	//log以2为底n的对数
	for (int i = 1; i < len; i*=2)
	{
		//一趟归并
		Merge(arr, len, i);
	}
}

void Show(int* arr, int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
}

int main()
{
	int arr[] = { 7,4,9,5,12,6,8,3,10,23,11 };
	int len = sizeof(arr) / sizeof(arr[0]);

	MergeSort(arr, len);
	Show(arr, len);

	return 0;
}

标签:归并,下标,23,--,len,gap,int,low2
From: https://blog.csdn.net/weixin_73974655/article/details/137210556

相关文章

  • Redission分布式锁介绍和配置引入
        本人在实际项目用于确保Key一致性经常使用的一种加锁方式,帮助分布式环境中互斥访问。很多人问不用锁不是一样完成目标吗?但需要清楚的是这是在高并发的场景下,多节点同时访问缓存的场景,是一般单体项目所无法比拟的,使用锁方式可以控制并发访问,避免缓存击穿和雪崩等问......
  • 五、Yocto集成QT5(基于Raspberrypi 4B)
    Yocto集成QT5本篇文章为基于raspberrypi4B单板的yocto实战系列的第五篇文章:一、yocto编译raspberrypi4B并启动二、yocto集成ros2(基于raspberrypi4B)三、Yocto创建自定义的layer和image四、Yocto创建静态IP和VLAN本章节实操代码请查看github仓库:meta-rpi-robot......
  • Unity 3D脚本编程与游戏开发(3.5)
    6.2.8总结和拓展        本节利⽤Unity官⽅素材,以有限的篇幅解释了动画状态机的原理,以及动画制作中最基本但最重要的步骤。总的来看,⽬前的动画只做了4种状态——站⽴、⾛、跑和跳跃,还缺少下蹲、下蹲移动和落地缓冲等动作。好在这些动作只是对现有动作的平⾏扩展,想要......
  • 故障诊断模型 | 基于LSTM长短期记忆神经网络的滚动轴承故障诊断(Pytorch)
    概述LSTM(LongShort-TermMemory)是一种常用的循环神经网络(RNN),在时间序列数据处理任务中表现优秀,可用于滚动轴承故障诊断。滚动轴承故障通常会导致振动信号的变化,这些振动信号可以被视为时间序列数据。LSTM能够捕捉时间序列之间的依赖关系,从而对滚动轴承的故障进行诊断。......
  • 故障诊断模型 | 基于多信号融合和改进的深度卷积生成对抗网络的不平衡数据故障诊断方
    文章目录文章概述模型描述参考资料文章概述本文提出了一种解决数据不平衡问题并提高诊断准确性的诊断方法。首先,通过小波变换处理来自多个传感器的信号,以增强数据特征,然后通过池化和拼接操作对其进行压缩和融合。随后,构建改进的对抗网络来生成新的样本进......
  • Oracle 低代码平台 Apex 最新版本 23.2 安装过程
    趁春节快结束前,安装了一把APEX,到目前为此,APEX最新版本为23.2,23.2和21版本有一些变化,只是用于验证,我是使用的单独模式,没有安装TOMAT,下面列一下安装过程:1.环境  ORACLELINUX9.3  GI19.22  ORACLE19.22  CDB  APEX23.22.使用PDB用于APEX  ......
  • Python 爬虫html内存 re.findall 正则提取span
    前言全局说明爬虫html内存re.findall正则提取一、百度首页热搜(和百度原网页代码有修改)需求:提取内容文字。<ulclass="s-hotsearch-content"id="hotsearch-content-wrapper"><liclass="hotsearch-itemodd"data-index="0"><spanclass=&q......
  • 信息工程大学第五届超越杯程序设计竞赛(同步赛)A遗失的旋律
    题目链接:A-遗失的旋律_信息工程大学第五届超越杯程序设计竞赛(同步赛)(nowcoder.com) 本场比赛的数据都很水,导致很多题暴力都能过,(出题人背大锅,说实话,如果数据不水,这场感觉质量是很高的这题一开始除了知道是线段树维护0,1个数,确实没什么很清楚的思路,后来看榜一大堆人都过了,就......
  • Dota2论文草稿
    手术机制人类测试游戏环境在rolloutworker上,Dota2的客户端有一个Lua的接口,用于编写机器人脚本,这里被改造成为从游戏内获取状态和输入动作的接口,同时,通过在游戏中集成一个gRPCserver的形式,实现远程调用的功能,这样就可以以docker容器的形式将dota2的客户端运行在大量的CPU集......
  • Someone important to me
    ......