归并排序

归并排序与原地归并排序 归并排序的思想:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2-路归并排序。其核心操作是将一个一维数组的前后相邻的两个子序列合并为一个有序序列。下图为一个2路归并排序的例子。 阅读详情

归并排序

例子: 5 2 1 6 4 7 9 0 8 3

  • 思路:
    1.采用分治算法:将一个大区间,不断划分成小区间。当区间中只有一个数时,对于该区间肯定是有序的,当区间中没有数时,区间也是有序的。
    2.申请一块额外的空间用来存储排序后的内容。
    3.将有序的小区间进行合并,保存到新申请的空间内。
  • 步骤:

1.申请空间,申请的空间大小为两个已经排序序列之和
2.设定两个指针,最初位置分别为两个已经排序序列的起始位置
3.比较两个指针所指向的元素,选择相对小的元素放到合并空间内,
并且移动指针到下一位置
4.重复上一步,知道都已指针到达序列尾
5.将另一序列剩下的所有元素直接复制到合并序列尾

  • 时间复杂度:
    O(nlogN) 分治算法,所以是logN

  • 空间复杂度:
    O(n)

void Merge(int arr[], int left, int mid,int right, int extra[])
{
	//两个区间 [left,mid] [mid,right]
	int left_Index = left; //左边区间的下标
	int right_Index = mid+1; //右边区间的下标
	int extra_Index = left; //extra的下标

	//合并两个有序数组
	while (left_Index <= mid && right_Index <= right)
	{
		if (arr[left_Index] <= arr[right_Index])
			extra[extra_Index++] = arr[left_Index++];
		else
			extra[extra_Index++] = arr[right_Index++];
	}

	//将还有剩余元素的数组放到extra中
	while (left_Index <= mid )
	{
		extra[extra_Index++] = arr[left_Index++];
	}

	while (right_Index <= right)
	{
		extra[extra_Index++] = arr[right_Index++];
	}

	for (int i = left; i <= right; i++)
	{
		arr[i] = extra[i];
	}
	return;
}

void _MergeSort(int arr[], int left,int right, int extra[])
{
	if (left == right)
	{
		//小区间中只有一个元素
		return;
	}
	if (left > right)
	{
		//小区间中没有元素
		return;
	}

	int mid = left + (right - left) / 2; 
	 //如果left == 0 right == 1,那么mid==0,如果对mid-1,数组下标就会出现负数,因此最好不要向前减小
	
	/*_MergeSort(arr,left,mid-1,extra);  //注意分组,划分小区间。
	注意!!!!在数组中,最好让数组下标往后越界,不要往前越界,
	     因为arr[-1] arr[11]差别还是很大的
	_MergeSort(arr, mid, right, extra);  */

	_MergeSort(arr,left,mid,extra); 
	_MergeSort(arr, mid+1, right, extra);  

	//合并两个有序数组
	Merge(arr,left,mid,right,extra);
}

void MergeSort(int arr[], int size)
{
	int *extra = (int*)malloc(40);
	
	_MergeSort(arr,0,size-1,extra); //采用了左闭右闭
	free(extra);
}
ADNI数据集下载(详细) 刚刚接触到这个数据集的时候比较头疼,用了好长的时间才把下载过程和预处理过程弄明白。需要发送电子邮件给官方平台,收到回信后才能够下载到数据集。 1、ADNI账号注册 第一步:搜索百度打开ADNI 第二步,点击ADTA&amp;amp;SAMPLES 第三步:一直将鼠标往下拉 点击ADNI,进入里面填写信息。需要填写的信息还是挺多的,耐心填写,再等到邮件回复就可以了 2、ADNI数据集下载 登录申请的邮... 阅读详情

相关推荐

海豚调度器(dolphinscheduler)再次使用,添加钉钉预警

1,首先我们部署是海豚调度器 1.3.8版本,由于页面只有邮件预警,所以在了解源码的同时,需要添加钉钉预警 2,说明,这一块是同事搞的,不是我搞的,新版本的dolphinscheduler已经有了钉钉模块,只是新版本还没有发布 3,我们现在只是添加简单的钉钉预警,任务成功或者失败会发送邮件+钉钉 4,具体操作 找到最新的源码devhttps://github1s.com/apache/dolphinscheduler/blob/dev/dolphinscheduler-alert/src/ma...

qq_31866793的博客 3083

归并排序详解

摘要:归并排序是我们常用的八大排序中的一种,其排序思路中和快速排序算法一样使用到了递归的思想,同时在归并排序中还用到了一个算法,就是有序数组合并算法。配合递归与有序数组合并算法,归并排序能够高效且稳定的完成排序,归并排序的优点在于其时间复杂度低,稳定性高,但是缺点也是有的,那就是空间复杂度很高。

云杉木屋 2万+

ArcGIS栅格拼接全攻略:从核心原理到色彩平衡与大数据处理

在GIS数据处理中,栅格拼接是一项基础且关键的操作,其本质是将多幅具有重叠区域的栅格图像无缝整合为一张完整地图。该技术涉及空间参考统一、像元对齐与色彩融合等核心原理,是构建连续地理空间数据的基石。其技术价值在于保障数据完整性、提升可视化效果,并为后续的空间分析提供可靠底图。在遥感影像处理、数字高程模型构建及地图制图等应用场景中,高质量的拼接成果至关重要。本文聚焦于ArcGIS平台,深入解析其栅格拼接工具,并针对常见的色彩不一致与大数据量处理难题,提供了基于**色彩平衡**和**金字塔**优化的实战解决方案,

weixin_33158887的博客 261

常见排序算法之归并排序——归并排序

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

保护小周ღ的博客 2402

本地大模型部署实战:LM Studio与Ollama的易用性与性能深度评测

本文对两款主流本地大模型部署工具LM Studio和Ollama进行了深度评测。LM Studio凭借图形化界面和内置模型库,为新手提供了开箱即用的便捷体验,并支持OpenAI兼容API,易于生态集成。Ollama则以命令行驱动,轻量高效,凭借其原生API和Modelfile自定义能力,在自动化集成和性能方面表现突出。文章从易用性、模型生态、性能及扩展性多维度对比,帮助用户根据自身技术背景和使用场景做出最佳选择。

weixin_29039773的博客 528

Cyclone MAX独立编程实战:从硬件接口到SAP镜像的嵌入式烧录指南

在嵌入式系统开发与量产中,固件烧录是连接软件与硬件的关键环节。其核心原理是通过特定的调试接口(如JTAG、BDM)和编程算法,将编译后的机器码写入目标处理器的非易失性存储器。这项技术的价值在于确保软件在硬件上的可靠部署,是产品功能实现和质量保证的基础,广泛应用于汽车电子、工业控制等对一致性与可靠性要求极高的领域。独立编程器(Stand-Alone Programmer)在此基础上,通过集成存储、交互界面和任务逻辑,实现了脱离PC的自动化操作,极大提升了产线效率和现场维护的便捷性。本文以Cyclone MAX

weixin_34038293的博客 466

归并排序与自然归并排序

1.归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题2.时间复杂度:O(N * logN)3.空间复杂度:O(N)4.稳定度:稳定.1.这玩意的思路相比于其它排序其实特别恶心,在生产环境中非常不建议使用,你的项目组成员可能会骂街(除非是这种情况:就比如你的数据结构老师心血来潮让你讲这个,那你也没办法...)2.时间复杂度:遍历了一次:O(n)3.空间复杂度:O(n)

asdssadddd的博客 1144

C语言实战:高效端口扫描器的多线程优化与性能对比

本文详细介绍了使用C语言开发高效端口扫描器的多线程优化技术,包括TCP全连接扫描、SYN半连接扫描和FIN扫描的实现原理。通过线程池、I/O复用技术和性能优化策略,显著提升扫描效率,并与Nmap进行性能对比。文章还涵盖了常见问题解决方案及安全伦理注意事项,为开发者提供全面的实战指导。

ol789012的博客 134

归并排序-自底向上的归并排序算法

归并排序 归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 算法描述 分解: 将原序列分解成length长度的若干子序列 求解子问题: 将相邻的两个子序列调用Merge算法合并成一个有序子序列 合并: 由于整个序列存放在数字a中,排序过程是就地进行的,合并步骤不需要执行

qq_45727976的博客 2989

【openGauss实战1】openGauss基于CentOS8的部署

基于openGauss数据库在CentOS8上的安装实践。

IT邦德 3048

Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.3 从零移植 busybox,基于RISC-V

上一章节我们已经成功启动了`Ubuntu`,但是由于`Ubuntu`占用系统空间过大,所以我转向占用较小的`busybox`,预计就占用`30M`左右。开始移植busybox,基于riscv64

DSMGUOGUO的博客 856

归并排序的一些拓展应用

归并排序的一些拓展问题, 包含小和问题, 逆序对问题, 翻转对问题, 区间和的个数问题.

trong_ 的烂笔头 870

【AI 赋能:Python 人工智能应用实战】16. BERT微调实战:中文新闻分类全流程(附模型蒸馏+ONNX部署完整代码)

中文新闻分类是NLP领域的经典实用任务,BERT模型凭借双向上下文建模能力,能有效解决中文歧义与长文本依赖问题,但存在推理速度慢、资源占用高的痛点。本文以THUCNews中文新闻数据集为核心,提供从数据预处理、BERT微调、模型蒸馏到生产部署的全流程实操指南。首先详解THUCNews的多编码读取与清洗(解决gbk/utf-8兼容问题);然后实现BERT微调,加入早停机制与混淆矩阵可视化,验证准确率达93.8%;接着用DistilBERT完成模型蒸馏,在仅损失0.6%准确率的前提下,将推理速度提升2.7倍。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1096

排序算法 归并排序(普通归并排序、自然归并排序)

自然归并排序:对于初始给定的数组,通常存在多个长度大于1的已自然排好序的子数组段.例如,若数组a中元素为{4,8,3,7,1,5,6,2},则自然排好序的子数组段有{4,8},{3,7},{1,5,6},{2}.用一次对数组a的线性扫描就足以找出所有这些排好序的子数组段.然后将相邻的排好序的子数组段两两合并,构成更大的排好序的子数组段({3,4,7,8},{1,2,5,6}).继续合并相邻排好序的子数组段,直至整个数组已排好序。(1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。

qq_36511401的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

链表的归并排序

链表的归并排序是一种高效、稳定的排序算法,非常适合链表这种数据结构。通过分治思想,将链表不断分割并合并,实现了对链表的排序。

2401_86909484的博客 1173

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数组排序之归并排序

归并排序(Merge Sort)是数组排序算法中一种常见的算法,其主要思想为经典的“分治思想”。本文将介绍数组排序算法中的归并排序,并介绍其相关应用。

山阴少年 2486

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

归并排序及模板

文章目录归并排序理解归并排序模板 归并排序理解 归并排序的主要操作如下: (1)分解。把初始序列分成长度相同的左、右两个子序列,然后把每个子序列再分成更小的两个子序列,直到子序列只包含一个数。这个过程用递归实现。 (2)求解子问题,对子序列排序。最底层的子序列只包含一个数,其实不用排序。 (3)合并。归并两个有序的子序列,这是归并排序的主要操作。比如下面举例,把a[ ]分成两个子序列,比较后存进b...

ker的博客 2050

归并排序算法、多路归并排序

base case:if(left>=right) return; 归并排序左半边,归并排序右半边,合并 void merge_sort(vector<int> &nums,vector<int> reg,int start,int end){ if(start>=end) return ; int mid=(end-start)/2+start; int start1=start,end1=mid; int start2=mid+

大灰狼吃树皮 4002

C++ 归并排序

归并排序的原理: (1)首先,把一个数组以中间元素为界限分成两组; (2)然后“左边数组”和“右边数组”中的元素分别进行比较; (3)最后合并两个已经排好顺序的数组,我们称之为归并排序。 #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; /**************************...

辛旭东小小工作室 1316

归并排序法

两个数组合并的归并排序法 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt; int merge(int* ar1, int len1, int* ar2, int len2, int** rtn) /*++ DeScription: This routine merge two s...

wukong 714
上一篇: 快速排序&堆排序
下一篇: 插入排序&希尔排序
Name_seven
博客等级 码龄9年 12粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值