排序算法——归并排序

C++排序算法:归并排序详解 阅读详情

归并排序

归并排序的思想:

归并排序的思想其实完全是分治法的思想的体现,它完全遵循分治法的模式。

这里有必要再重提下分治法的思想:

将原有的问题分解为几个规模较小的但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来求得原问题的解。

现在来看看归并排序的操作:

1 将等待排序的含有 n 个元素的序列分解成各具有 n/2个元素的两个子序列 (n为奇数时,某个子序列比另一个会多一个元素 但不会影响结果)

2 使用归并排序递归的排序两个子序列 ( 说白了就是把开始已分解的两个子序列再各自往下分解 )

3 合并两个已经排好序的子序列

 

简单的例子:

我们有一个序列 6 5 3 1 8 7 2 4

1 我们将其分为两组 一组为 6 5 3 1  另一组为 8 7 2 4

2 对前面两组再进行分解 6 5  和 3 1     以及  8  7  和 2  4

3 各小组进行排序得到    5 6  和  1 3     以及 7  8  和 2  4

4  5 6 和 1  3两个小组进行合并 (比较并排序)   以及 7   8  和 2  4 两个小组进行合并 (比较并排序) 得到两个小组 1 3 5 6 和2 3 4 8

5 这两个小组再合并 (比较并排序)  得到最终解 1  2  3  4  5  6  7  8

 

代码实现:

<span style="font-size:18px;">#include<iostream>
using namespace std;
int array1[100]={0},array2[100]={0};//两个数组,用于记录分解后的两个子序列
void Merge(int a[],int p,int q,int r)
{
	int n1=q-p+1;
	int n2=r-q;
	int i,j;
	for(i=0;i<n1;i++)
		array1[i]=a[p+i];
	for(j=0;j<n2;j++)
		array2[j]=a[q+j+1];
	array1[n1]=9999;//9999是哨兵,起到终止比较的作用
	array2[n2]=9999;
	i=j=0;
	for(int k=p;k<=r;k++)//for循环用来合并两个子序列
	{
		if(array1[i]<=array2[j])
		{
			a[k]=array1[i];
			i+=1;
		}
		else
		{
			a[k]=array2[j];
			j+=1;
		}
	}
}
void Merge_Sort(int a[],int p,int r)
{
	if(p<r)
	{
		int q=(p+r)/2;
		Merge_Sort(a,p,q);//递归调用合并左侧的子序列
		Merge_Sort(a,q+1,r);//递归调用合并右侧的子序列
		Merge(a,p,q,r);//递归调用进行分解并合并
	}
}
int main()
{
	int a[8]={6,5,3,1,8,7,2,4};
	Merge_Sort(a,0,7);
	for(int i=0;i<8;i++)
		cout<<a[i]<<" ";
	return 0;
}
</span>


 

西门子PLC新手必看:200SMART与1200/1500的MODBUS RTU通讯实战(附完整配置流程) 本文详细解析了西门子PLC中S7-200 SMART与S7-1200/1500之间实现MODBUS RTU通讯的完整实战流程。内容涵盖硬件接线、软件配置及程序编写,重点讲解了200SMART作为从站、1200/1500作为主站的典型架构,并提供了关键功能块的使用方法和常见问题排查技巧,帮助新手快速打通不同系列PLC间的数据交换。 阅读详情

相关推荐

LabVIEW与MySQL实时数据存储:传感器采集与数据库同步实践

本文详细介绍了如何将LabVIEW与MySQL结合,实现传感器数据的实时采集与高效存储。通过设计合理的数据库表结构、配置LabVIEW数据库连接工具包,并编写核心的采集与存储VI,构建了稳定可靠的数据链路。文章重点分享了批量插入、连接管理、时间同步等关键优化技巧与避坑指南,帮助工程师应对工业监控、环境监测等场景下的实时数据同步挑战。

weixin_29281915的博客 261

排序算法之归并排序

归并排序和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。

9288

Mac上MySQL出现secure-file-priv为null

在使用MySQL导入导出文件时出现了错误,原因是没有配置secure-file-priv。 我的MySQL版本是8.0.13,使用如下命令查看secure-file-priv。 结果发现secure-file-priv为空,此时需要为它配置一个文件夹。 解决方案: 1)到MySQL的安装目录中去,Mac中是的是 /usr/local/mysql/support-files,该目录下有一...

zhangvalue的博客 5883

【排序算法】—— 归并排序

合并的具体思路:定义三个指针分别指向第一、二个序列和临时序列的第一个元素,然后对指针指向的元素进行比较,将较小的那一个元素添加到临时序列中,随即将对应的指针往后移动一位,直到指向第一个序列或第二个序列的指针走完,因为两个序列都是有序的,所以此时将没有走完的指针所指向的位置的后面所有元素都放入临时序列中即可。因此,我们的问题就得以解决了,第一步就是。来判断此时序列中元素的个数和该子序列在整个序列中的具体位置,然后不断将其从中间进行分割,直到只有一个元素,此时退出递归,回到上一层,进行合并即可。

2302_80243065的博客 2041

simulink可控励磁同步电机模型分析

他励同步电机模型分析

qq_26681609的博客 5551

快衰落、慢衰落,平坦衰落、频率选择性衰落

目录一、大尺度衰落和小尺度衰落二、平坦衰落和频率选择性衰落1.反射墙、固定天线模型2.相干带宽和时延扩展三、快衰落和慢衰落1.反射墙、运动天线模型2.相干时间和多普勒扩展四、联系总结 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、大尺度衰落和小尺度衰落 移动无线信道的主要特征是信道强度关于时间和频率的变化,大致分两种: 大尺度衰落: .

weixin_45662974的博客 3万+

排序算法之归并排序分析

归并排序 排序思想: 归并排序使用的就是分治思想,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。 这种将大问题分解成小问题的思想与递归很像,分治和递归的区别就是:分治是一种解决问题的处理思想,递归是一种编程技巧 如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。 归并排序...

qq_42006733的博客 1938

运算放大器测试方法-输入失调电压

由于运放输入回路的不对称性,在输入端将产生一定的误差信号,从而限制运放信号灵敏度。通常用输入失调电压(VOS)、输入失调电流(Ios)和输入偏置电流(IB)表示。运放有四个主要特征:输入失调特征、开环特征、共模特征及输出特征。其放大倍数较大,由于外界的影响,即使运放的输入端产生较小的输入信号,经过放大,在输出端也会产生较大的误差。为能精确测量其性能,一般采用辅助运放进行测试。下面着重讲了运放的主要参数及如何精确测量这些参数。文中DUT代表被测运放,A代表辅助运放。

weixin_46135931的博客 1万+

【十大排序算法】归并排序

归并排序,如同秋日落叶,分散而细碎, 然而风吹叶动,自然而有序, 彼此相遇,轻轻合拢, 最终成就,秩序之谧。

DC1020的博客 1175

AI工程化之生成式UI & A2UI(二)

本文介绍了生成式UI框架A2UI的架构设计与核心实现。项目采用AI协作开发模式,通过ATDD(AI驱动的测试驱动开发)确保代码质量。前端SDK基于zustand实现框架无关的状态管理,包含协议解析器、存储管理、渲染器等核心模块。重点展示了基础store构建、A2UI协议解析器的实现过程,包括mock数据准备、测试用例生成和可视化调试。项目采用monorepo管理,利用vite实现高效开发构建。整个系统设计遵循模块化原则,通过清晰的接口定义实现各组件解耦,为后续功能扩展打下基础。

qq_34306228的博客 406

Visual C++与WPF混合开发:C++/CLI桥接技术实现现代化桌面应用

在桌面应用开发领域,混合编程技术是连接不同技术栈、复用核心资产的关键手段。其核心原理在于通过特定的桥接层,实现托管代码与非托管代码之间的互操作,从而打破语言和运行时环境的壁垒。这项技术的核心价值在于,它允许开发者将高性能、高稳定性的原生C++业务逻辑库,与现代化、高表现力的WPF用户界面无缝结合,避免了重写核心代码的巨大成本和风险。在工业控制、数据可视化、上位机软件等对性能和界面均有高要求的应用场景中,这种架构尤为适用。本文以C++/CLI作为桥接技术,详细演示了如何构建一个包含原生C++核心层、C++/C

weixin_33146151的博客 278

【排序算法】 ——— 归并排序总结

文章目录

Lebron 858

图像修复的万能模型:用Instruct-IPT统一解决去雨、去雾、去模糊三大难题

从原理到实战,你已经掌握了Instruct-IPT的核心逻辑和使用方法。它不仅能一站式解决多种图像退化问题,还能通过文本指令灵活控制,是图像恢复领域的“多面手”。现在,不妨找几张有雨雪、雾霾、模糊问题的图像,用Instruct-IPT亲手试试效果。当你看到模糊的图像变得清晰,被雨雾遮挡的细节重新浮现时,你会真切感受到这项技术的魅力。后续还可以尝试调整文本指令的描述方式,看看模型的响应有什么变化——探索的过程,就是你技术进阶的最好见证。

m0_71589036的博客 226

十大排序算法之归并排序

一、算法简介 归并排序(Merge sort)是建立在归并操作上的一种稳定、有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 实现方法分为 自上而下的递归 自下而上的迭代 二、原理 1. 从下往上的归并排序:将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列,再...

一只小白的博客 1046

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

排序算法之 - 归并排序

归并排序也有类似于快速排序的 切割 的过程,但是快速排序会选择基准值,而归并排序则直接将列表 尽可能两等分(若长度为奇数,那么有一侧会少一个元素,左侧还是右侧是无妨的)。当分割到左右两侧都只剩下一个元素的时候,分割完成,开始往上层拼接结果。拼接的大致流程是:取左右两侧队首的元素,比较两者大小,较小的先进入已排序列表。重复执行此流程,直至有一侧为空,将另一侧剩余元素直接合并到已排序列表的右侧。鬼归...

我希望,快乐,在我走过的地方绽放。。。。 8504

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

归并排序比较次数_排序算法

排序指的是将一组对象按照某种逻辑重新排列的过程,在计算机早期,大约30%的时间都用在排序上,今天这个比例降低了,这得益于高效的排序算法。排序有大量的应用场景,它往往是解决问题的第一步,它很基础但很重要,比如快速排序就被誉为20世纪科学和工程领域10大算法之一。排序如此有用的一个重要原因是在一个有序数组中查找一个元素比在一个无序数组中查找要简单的多。今天我们就来研究一下。本文从排序的经典算法开始分析...

weixin_39959349的博客 4483

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

归并排序思想及其他排序算法的比较次数和交换次数

一.归并排序思想 二.合并两个排序数组 三.其他排序算法比较次数和交换次数总结

mudooo的博客 8990

排序算法4之归并排序

归并排序归并排序是建立在归并操作上的一种排序算法,该算法采用分治的思想(divide and conquer)。就是先将序列进行分裂成一个个子序列,使得每个子序列都是有序的,然后再将所有的子序列整合成一个完整的序列。所以整个算法分为两部分,分裂和合并。分裂比较简单,最容易想到的就是折半分解,直至每个子序列是一个单独的数为止。合并就可能麻烦一点。合并 假设存在两个已经排列好的子序列{a1,a2,a3

小羊哈利 673

排序算法总结之归并排序

基本思想 设归并排序的当前区间是R[low..high],分治法的三个步骤是: ①分解:将当前区间一分为二,即求分裂点                  ②求解:递归地对两个子区间R[low..mid]和R[mid+1..high]进行归并排序; ③组合:将已排序的两个子区间R[low..mid]和R[mid+1..high]归并为一个有序的区间R[low..high]。

生命在于折腾 1866
上一篇: Java SDK 解决SDK Manager更新SDK异常问题
下一篇: Android:Failed to install UIWidgetTest.apk on device 'emulator-5554': timeout
cassiePython
博客等级 码龄12年 303粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值