二路归并排序算法(递归&非递归)

全自动数据分析 - Claude Code Sub-Agents:自动化数据分析工厂 别忘了!claude code也是agent框架,类似langgraph,crewAI,autogen等等agent框架。我改造claude code搞一个数据分析智能体AI。试试看行不行!:让数据分析变得像聊天一样简单! 阅读详情

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。

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

时间复杂度为O(nlogn),空间复杂度为 O(n),归并排序比较占用内存,但却效率高且是稳定的算法。

以下为递归实现的版本:

#include<iostream>
using namespace std;
void Merge(int arr[],int low,int mid,int high)
{//low为第1有序区的第1个元素,i指向第1个元素, mid为第1有序区的最后1个元素
	int i=low,j=mid+1,k=0;  //mid+1为第2有序区第1个元素,j指向第1个元素 
	int *temp=new(nothrow) int[high-low+1]; //temp数组暂存合并的有序序列
	if(!temp)//内存分配失败 
	{
		cout<<"ERROR!";
		return;
	}
	while(i<=mid && j<=high)//顺序选取两个有序区的较小元素,存储到t数组中
	{
		if(arr[i]<=arr[j])//较小的先存入temp中
			temp[k++]=arr[i++];
		else
			temp[k++]=arr[j++];
	}
	while(i<=mid)//若比较完之后,第一个有序区仍有剩余,则直接复制到t数组中
		temp[k++]=arr[i++];
	while(j<=high)//同上
		temp[k++]=arr[j++];
	for(i=low,k=0;i<=high;i++,k++)//将排好序的存回arr中low到high这区间 
		arr[i]=temp[k];
	delete []temp;//删除指针,由于指向的是数组,必须用delete [] 
}
void MergeSort(int arr[],int low,int high) 
{//用递归应用二路归并函数实现排序——分治法
	if(low<high)//(是if,不是while!,且不含等号!否则死循环!)
	{
		int mid=(low+high)/2;
		MergeSort(arr,low,mid);
		MergeSort(arr,mid+1,high);
		Merge(arr,low,mid,high);
	}
}
int main()
{
	int x[]={0,5,-2,1,-8,7,6,-3};
	MergeSort(x,0,7);
	for(int i=0;i<8;i++)
		cout<<x[i]<<" ";
	return 0;
}





参考 http://www.cnblogs.com/hackerain/archive/2011/01/07/2130424.html


非递归实现版本:

Merge函数和上面递归实现是完全一样的,MergeSort形参改成了待排序数组和数组大小。

#include<iostream>
using namespace std;
void Merge(int arr[],int low,int mid,int high)//递归和非递归均一样 
{//将两个有序区归并为一个有序区
	int i=low,j=mid+1,k=0;
	int *temp=new(nothrow) int[high-low+1];
	while(i<=mid&&j<=high)
	{
		if(arr[i]<=arr[j])
			temp[k++]=arr[i++];
		else
			temp[k++]=arr[j++];
	}
	while(i<=mid) temp[k++]=arr[i++];
	while(j<=high) temp[k++]=arr[j++];
	for(i=low,k=0;i<=high;i++,k++)
		arr[i]=temp[k];	
	delete []temp;
}
//void MergeSort(int arr[],int low,int high)//递归版本的形参表 
void MergeSort(int arr[],int n)//参数和递归略不同,n代表数组中元素个数,即数组最大下标是n-1 
{//非递归实现 
	/*
	int step = 1;
	while(step<n) //当元素个数不是2的幂时可能会出错,未考虑第2个序列个数不足的情况 
	{
		for(int i=0;i<=n-step-1;i+=2*step)
			Merge(arr,i,i+step-1,i+2*step-1);
		step*=2;
	}*/

	int size=1,low,mid,high;
	while(size<=n-1)
	{
		low=0;
		while(low+size<=n-1)
		{
			mid=low+size-1;
			high=mid+size;
			if(high>n-1)//第二个序列个数不足size 
				high=n-1;		
			Merge(arr,low,mid,high);//调用归并子函数 
			cout<<"low:"<<low<<" mid:"<<mid<<" high:"<<high<<endl;//打印出每次归并的区间 
			low=high+1;//下一次归并时第一关序列的下界 
		}
		size*=2;//范围扩大一倍 
	}
}
int main()
{
	int x[]={4,-5,0,3,-1,12,9,-7,8,-4,11};
	MergeSort(x, 11);
	for(int i=0;i<11;i++)
		cout<<x[i]<<" ";
	return 0;
}


图中的low mid high输出的是每次调用Merge函数时传的3个参数,便于分析每次合并所在的区间。


SIMULINK开发项目实例 1000 例专栏之第912例--AC-DC整流器场景:基于PWM整流器拓扑结构的建模:三相电压型PWM整流器(SR)单位功率因数控制仿真 本文详细介绍了使用Simulink和Simscape Electrical搭建三相电压型PWM整流器(VSR)模型的方法。主要内容包括:系统结构设计、主电路拓扑搭建、单位功率因数控制算法实现(含PLL锁相环、dq变换、PI控制器等模块)、参数配置和仿真设置。通过仿真分析验证了该系统能实现输入电流与电压同相位、输出直流电压稳定等特性,体现了PWM整流器的高效性和低谐波优势。文章还提出了增强鲁棒性、多工况测试等优化建议,为电力电子系统设计提供了实用指导。该建模方法对新能源发电、电动汽车充电等领域具有重要意义。 阅读详情

相关推荐

二路归并算法排序

二路归并算法 排序 归并排序

二路归并排序

给定一个整数序列,请按非递减序输出采用二路归并排序递归法)的各趟排序后的结果(每完成一次归并操作就输出归并后的结果)。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。 输出格式: 对于每组测试,输出若干行,每行是一趟排序后的结果,每行的每两个数据之间留一个空格。 输入样例: 6 73 12 27 98 81 64 输出样例: 12 73 27 98 81 64 12 27 73 98 81 64 12 27 73 81 98 64

qq_62023961的博客 2714

VMware17安装包

虚拟机安装包附密钥

C语言实现归并排序——2路归并排序

C语言实现归并排序 文章目录C语言实现归并排序2路归并排序算法1.定义动态数组2.初始化动态数组3.归并操作4.归并排序算法实现项目完整代码运行效果图 2路归并排序算法 1.定义动态数组 //定义一个动态数组 typedef struct { int *data; } DSqList; 2.初始化动态数组 //动态数组初始化 void InitDSqList(DSqList &amp;L, int len) { //根据数组A的长度动态分配辅助数组B的空间 L.data = (in

酒醉浮生的博客 3847

点赞狂魔

微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。然而有这么一种人,他们会通过给自己看到的一切内容点赞来狂刷存在感,这种人就被称为“点赞狂魔”。他们点赞的标签非常分散,无法体现出明显的特性。本题就要求你写个程序,通过统计每个人点赞的不同标签的数量,找出前3名点赞狂魔。 输入格式: 输入在第一行给出一个正整数N(...

韶言大雅 865

快排与归并排序

简单介绍快排和归并排序的一般写法和思路,重在理解!!! 1. 快排属于分治算法,分治算法一般都有三步... 2. 归并排序运用了双指针的思想,先递归再排序...

Tom的博客 1253

算法设计与分析 - 绪论

算法绪论(Algorithm) 一、算法初步 1 算法的五大特性 输入:一个算法有零个或者多个输入 输出:一个算法有一个或多个输出 有穷性:一个算法必须在执行有限步数之后结束,且每一步需要在有穷时间内完成 确定性:每条指令必须有确切的含义,对于相同的输入只能得到相同的输出 可行性:算法可执行 2 算法的四个要求 正确性 可读性 健壮性 高效率与低存储量 3 算法的描述方法 自然语言 流程...

Targetu 未来可期 2214

C语言实现二路归并算法

C语言实现二路归并算法 #include&lt;stdio.h&gt; //将有序的sr[i...m]和sr[m+1...n]归并为有序的tr[i...n] void merge(int sr[],int tr[],int i,int m,int n) { int j,k; for(j=m+1,k=i;i&lt;=m&amp;&amp;j&lt;=n;++k) if(sr[i]&lt;sr[j]) tr[k]=sr[i++]; else tr[k]=sr[j++]; while(i&lt;=m

weixin_45683301的博客 863

数据结构课程设计个人任务8:二路归并排序

输入说明 : 第一行:顺序表A的数据元素的数据类型标记(0:int,1:double,2:char,3:string) 第二行:待排序顺序表A的数据元素(数据元素之间以空格分隔) 输出说明 : 如第一行输入值为0、1、2、3之外的值,直接输出“err” 否则: 第一行:待排序顺序表的遍历结果 第二行:第一趟的排序结果 ... 第n行: 最终的 #include &lt;iostream&gt; #include &lt;bits/stdc++.h&gt; using names

m0_50488710的博客 572

二路归并排序_2011_10_11

//二路归并排序 void myMerge(int R[], int R1[], int nLow, int nMid, int nHigh) { int i = nLow;//原序列的开始位置 int j = nMid + 1;//在原序列中有两条序列,这是后一条序列的起始

Code Space 599

464. 整数排序 II-归并排序递归非递归实现

实现思路:https://blog.csdn.net/morewindows/article/details/6678165 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如...

AthlenaA的博客 432

排序算法之——二路归并排序

排序算法之——二路归并排序 二路归并排序的思想: 一次排序过程,将已经各自有序的两个段的数据合并一个段,并且合并后依旧有序 开始,我们认为单个数据是有序的,一个数据就是一个段,一次排序之后,两个数据就是一个有序数据段,这样下一次每个数据段就是两个数据。最后将其合并成一个完成有序段,则整个数据就已经排序好了 时间复杂度: O(nlog(n)) 空间复杂度: O(n) 稳定性: 稳定 代码实现void Meger(int* arr, int len, int width, int *brr) { int

weixin_43822955的博客 1199

排序算法(七) 2路归并排序

一、什么是归并排序?        归并排序的特点体现在 “归并” 上,“归并” 就是“合并”!将两个或两个以上有序的序列合并为一个有序的序列。而2路归并就是将两个有序序列合并为一个有序序列。 二、一个2路归并排序的图例: 三、由上图得出归并排序思路:       、怎样合并两个有序序列(在后面程序中给出)       、实现归并算法:将r1[ ] 中的元素用归并法排序后放到 r3[

迷雾江湖 的博客 1818

7-1 二路归并排序

给定一个整数序列,请按非递减序输出采用二路归并排序递归法)的各趟排序后的结果(每完成一次归并操作就输出归并后的结果)。

shineinwind的博客 681

7-2 寻找大富翁 (34 分)

胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人。假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁。 输入格式: 输入首先给出两个正整数N(≤106)和M(≤10),其中N为总人数,M为需要找出的大富翁数;接下来一行给出N个人的个人资产值,以百万元为单位,为不超过长整型范围的整数。数字间以空格分隔。 输出格式: 在一行内按非递增顺序输出资产排前M位的大富翁的个人资产值。数字间以空格分隔,但结尾不得有多余空格。 输入样例: 8 3 8 12 7 3

sway12138的博客 1090

归并排序法

归并排序法

lightfuturezyx99的博客 396

2-路归并排序(递归)与 (非递归

2-路归并排序的原理是,将序列两两分组,将序列归并为[n/2]个组,组内单独排序; 然后将这些组再两两归并,生成[n/4]个组,组内再单独排序; 以此类推,直到只剩下一个组为止。时间复杂度为O(nlogn)。 #include &lt;iostream&gt; using namespace std; const int maxn = 100; //归并两个有序区间 void merge(int a[], int L1, int R1, int L2, int R2){ int i = L1, j

YSL 606

【八大排序】二路归并排序(非递归 + 递归)

目录 前言 两两融合规则 二、代码实现 1.非递归实现 2.递归实现 总结 前言 归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 这些子问题解决的方法都是类似的,解决掉这些小的问题之后,归并子问题的结果,就得到了“大”问题的解。 时间复杂度:..

W1024201的博客 8463

数据结构和算法-09-排序

数据结构和算法-09-排序

北巷东东的专栏 895

PTA二路归并排序

PTA二路归并排序

fffffffffffsq的博客 1774
上一篇: 汉诺塔问题(递归)
下一篇: 矩阵连乘问题(动态规划)
枫轩缘
博客等级 码龄17年 101粉丝 124原创
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值