【排序算法】合并排序超级总结

合并法排序 合并法排序(Merge Sort)是一种基于分治思想的排序算法,其原理如下:1.将待排序数组分成两个子数组,每个子数组包含大约相等数量的元素。2.递归地对子数组进行排序,直到每个子数组的大小为1。3.将已排序的子数组合并成一个新的排序数组,合并过程中按照从小到大的顺序逐个比较两个子数组中的元素,并将较小的元素放入新数组中,直到所有元素都被放入新数组中。4.最终得到一个有序数组。合并排序的时间复杂度是O(nlogn),其中n是待排序数组的长度。它的空间复杂度是O(n)。 阅读详情

一、介绍

基本的排序算法主要可以分为两大类。第一类时基于逐个比较的,第二类是非比较的。插入排序Insertion sort,冒泡排序bubble,和希尔排序Shell sort都是基于比较模型的。这三个算法的时间复杂度为O(n^2),实在是太慢了。是否有可能比O(n^2)更快的排序方法呢?答案当然是有的。

前面三种算法都是从待排序列表开始比较其中的每两个元素大小。插入排序和冒泡排序作了很多次比较,这正是合并排序所克服的。

所有我们需要将一个长的待排序列分割成比较小的序列,然后再进行排序,最后进行合并操作。所有合并排序可以分为“拆分和合并”两步来完成。

 

二、实现

合并排序速度比较快并且并不难实现,这对于开发人员来说至关重要,下面给出合并排序的C语言实现,合并排序可以分为递归形式和迭代形式实现,迭代形式比递归形式需要更多的存储空间,这里主要给出递归的实现方法:

(1)有序段合并函数

/*将有序断a[p]至a[q]段和有序段a[s]至a[t]段合并到b[p]至b[t],Len为数组长度*/
void merge(int a[],int p,int q,int s,int t,int Len) 
{   
	int n=10;
	int i,j,k;
	int *b=(int *)malloc(Len*sizeof(int));
	/*定义三个指针初值*/
   i=p;
   j=s;
   k=p-1;

while((i<=q)&&(j<=t)) //当两个有序段都不为空时
{
	if(a[i]<=a[j])
		b[++k]=a[i++]; //合并
	else
		b[++k]=a[j++];
}
while(i<=q) 	//处理有序段1剩下的元素
b[++k]=a[i++];
while(j<=t)             //处理有序段2剩下的元素
	b[++k]=a[j++];        

 for(i=p;i<=t;i++)      //将合并后的有序段移到源数组a
	 a[i]=b[i];
   

}


 

(2)主控函数

void merge_sort(int a[],int i,int j,int Len)
{
	int k;
	if(i<j)
	{
		k=(i+j)/2;    // K分段终点
		merge_sort(a,i,k,Len);  //对左端进行排序
		merge_sort(a,k+1,j,Len);
		merge(a,i,k,k+1,j,Len);   //合并左右端
	}
}


 调用方法:

void main()
{   
	
    int a[]={20,13,4,2,87,9,8,5,46,26};
	int Len=sizeof(a)/sizeof(int);
 	merge_sort(a,0,Len-1,Len);
 
	printf("排序后为:\n");
	for(int i=0;i<Len;i++)
		printf("%d ",a[i]);
}


三、复杂性

合并排序在最坏情况下的复杂度为O(n*log(n)),而快速排序在最坏情况下的复杂度为O(n2),并且合并排序是一个稳定的排序。

四、合并排序算法有效的两个原因

(1)不管输入是什么都非常快。

合并排序是一个稳定的并快速的排序算法,在最坏的情况下时间复杂度为O(n*log(n)),快速排序为O(n2),当n=20时,快速排序比合并排序要慢4.6倍。由此可见,合并排序有很大的优势。

(2)容易实现。这对于开发者来说也是重要的原因。

五、合并排序算法失效的三个原因

(1)比基于非比较的排序算法慢。不过这取决于输入数据。

(2)。对于初学者来说比较难实现。尤其是对于合并部分。

(3)。当输入数据接近有序,合并排序的速度要比冒泡排序和插入排序要慢。因为插入排序和冒泡排序在最好的情况下的复杂度为O(n).而合并排序在最好的情况下时间复杂度为O(n*log(n))

综上所述,合并排序是一个实用很好的算法之一,因为他实现容易并且比较快,值得每一位开发者去学习。

二路归并 && 插入归并 && 原地归并 插入归并 归并排序的时间复杂度为O(nlgn),空间复杂度为O(n); 但是一般来讲,基于从单个记录开始两两归并的排序并不是特别提倡,一种比较常用的改进就是结合插入排序,即先利用插入排序获得较长的有序子序列,然后再两两归并(改进后的归并亦是稳定的,因为插入排序是稳定的)。之所以这样改进是有原因的:尽管插入排序的最坏情况是O(n^2),看起来大于归并的最坏情况O(nlgn),但通常情况下,由于插 阅读详情

相关推荐

Python实现耐心排序算法——超级归并排序

这个算法的思路比较清晰,实现起来也相对简单,但是由于牌堆需要作为一个新的数据结构,因此在Python中的实现相对其他语言会略显繁琐一些。当一个元素要被放进已有牌堆的时候,首先需要从已有牌堆中找到第一个比该元素大的牌堆,如果不存在比该元素大的牌堆,则将该元素追加到最后一张牌堆后面。耐心排序又称为超级归并排序,是一种排序算法,用于对一个序列进行排序。在已经构建好的所有牌堆中,每个牌堆都是有序的,可以使用归并排序的思想对这些牌堆进行合并。下面,我们就来详细介绍一下Python实现的耐心排序算法——超级归并排序。

m0_47037246的博客 230

浅谈算法和数据结构: 三 合并排序

合并排序,顾名思义,就是通过将两个有序的序列合并为一个大的有序的序列的方式来实现排序。合并排序是一种典型的分治算法:首先将序列分为两部分,然后对每一部分进行循环递归的排序,然后逐个将结果进行合并。   合并排序最大的优点是它的时间复杂度为O(nlgn),这个是我们之前的选择排序和插入排序所达不到的。他还是一种稳定性排序,也就是相等的元素在序列中的相对位置在排序前后不会发生变化。他的唯一缺点是,...

weixin_34281537的博客 527

【python】各种排序算法代码大集合

超级好用的口诀:时间复杂度:快些以nlogn的速度归队。稳定性:心情不稳定,快些选一堆好友来聊天吧。直接插容易插变O(N),起泡起得好变O(N).(初始序列已经有序)插入排序法在近乎有序的情况下,效率特别高,通过插入排序,可以引申出希尔排序归并排序:左半部分排好序,右半部分排好序,然后,把他们合并成一个有序的数组在有序数组中查找一个数:遍历O(n),二分O(logN)Merge sort和Quick sort:都使用了分治算法归并排序:切+merge。

升级迭代 954

合并排序算法的时间复杂度是多少?

综合以上三个阶段,合并排序算法的总时间复杂度是 O(n log n)。此外,由于合并排序算法的空间复杂度也是 O(n)(需要额外的空间来存储子数组),因此它也是一种空间效率较高的排序算法。但是,由于每次合并操作涉及的子数组大小逐渐加倍,所以合并阶段总共需要进行 log n 次合并操作。合并排序算法的时间复杂度是 O(n log n),其中 n 是待排序数组的元素个数。:在解决阶段,每个子数组已经是排序好的(只包含一个元素),因此这个阶段的时间复杂度是 O(1)。

道亦无名 1441

数据结构与算法:排序算法的分治算法优化

在计算机的世界里,排序算法就像是一位勤劳的小管家,它能把一堆杂乱无章的数据整理得井井有条。但是有些排序算法在面对大量数据时,就会变得慢吞吞的,效率很低。我们这篇文章的目的就是要学习如何使用分治算法来优化排序算法,让排序变得又快又好。我们会涵盖常见的排序算法,像冒泡排序、选择排序等,看看分治算法是怎么让它们脱胎换骨的。接下来的内容,我们会先通过一个有趣的故事引出核心概念,解释排序算法和分治算法到底是什么。然后说说它们之间是怎么相互配合的,还会用示意图和流程图让你看得更明白。

AI 算法实战派 859

易语言超级列表框排序技术实现

本文还有配套的精品资源,点击获取 简介:易语言超级列表框排序技术是一种在易语言编程环境下,通过高级功能对列表框中的数据进行高效管理的方法。超级列表框通过提供多列排序、自定义列宽、复选框等功能,改善用户交互体验。本技术涵盖了消息处理、自定义排序函数、数据保存、文本处理以及与Windows API交互等关键概念,是提升易语言用户界面设计与交互能力的基础。 1. 易语言...

weixin_35748962的博客 1758

合并排序算法的时间复杂性分析

算法分析 假设待排序序列中元素个数为n。 显然,当n=1时,合并排序一个元素需要常数时间,因而T(n)=O(1)。 当n>1时,将时间T如下分解: 分解:这一步仅仅是计算出子序列的中间位置,需要常数时间O(1)。 解决子问题:递归求解两个规模为n/2的子问题,所需时间为2T(n/2)。 合并:对于一个含有n个元素的序列,Merge算法可在O(n)时间内完成。 将以上阶段所需的时间进行相

LLXLQY的博客 1万+

信号处理领域的研究生看过来:手把手教你搞定ICASSP 2025论文投稿(附Latex模板与格式检查清单)

本文为信号处理领域研究生提供ICASSP 2025论文投稿的详细指南,涵盖Latex模板使用、格式检查清单及投稿流程。特别针对IEEE旗舰会议的严格要求和2025年可能出现的新变化,提供预判性建议和实战技巧,帮助作者高效完成论文投稿。

程涛 561

超级列表框排序mysql,易语言超级列表框排序源码

易语言超级列表框排序源码.版本2.支持库iext.程序集窗口程序集1.程序集变量集_中文,文本型,,"0".程序集变量集_中文排序,整数型,,"0".程序集变量集_大写字母,文本型,,"0".程序集变量集_大写字母排序,整数型,,"0".程序集变量集_小写字母,文本型,,"0".程序集变量集_小写字母排序,整数型,,"0".程序集变量集_数字...

weixin_33683833的博客 1609

【C++PTA】6-1 Point类的运算 (10 分)

定义Point类,有坐标x,y两个私有成员变量;对Point类重载“+”(相加)、“-”(相减)和“==”(相等)运算符,实现对坐标的改变,要求用友元函数和成员函数两种方法实现。对Point类重载<<运算符,以使得代码 Point p; cout<<p<<endl;可以输出该点对象的坐标。 函数接口定义: 实现Point类。 裁判测试程序样例: /* 请在这里填写答案 */ int main(int argc, char const *argv[]) { P

libertye的博客 2367

ifix5.8连接ab plc的点-通过rslinx

以ifix连接ab plc的点为例 1.先在rslinx上把plc的点导出为opc server 2.使用opc power tool 作为opc client 去连接 3.保存到项目的PDB文件夹下面,并且以节点名命名。 也可以不以节点名命名,系统自动会生成一个以节点名命名的这种文件,就显得很乱。 同时,项目的PDB目录下面必须还得拷过来一个de...

中国智造2025 4110

Java 排序算法

是一种。

m0_73837751的博客 929

QT实现串口通信

要实现串口通信,需要知道串口通信需要的信息 主要参数有:波特率、校验位、数据位、停止位、控制流 主要操作有:串口的打开和关闭、刷新设备串口、接发数据、开关显示灯等。 实现效果如图: 最后附赠完整源码。 第一步:在头文件中引入 QtSerialPort 类的两个头文件(必须引入) // 引入串口通信的两个头文件(第一步) #include <QtSerialPort/QSerialPort> // 提供访问串口的功能 #include <QtSerialPo

m0_49456900的博客 6万+

排序算法的推导思想

排序算法的推导思想主线:排序算法的来龙去脉地精排序:攘外必先安内(贪心)冒泡排序:一直攘外(贪心)选择排序优化:比而不换锦标赛排序:从全局排序到局部排序(只排前几名,少做无用功)堆排序:锦标赛排序的改进   主线:排序算法的来龙去脉 计算机最早的排序算法源于人的生活和经验,那么我们人是怎么排序的呢? 如果只有三五个数字,我们可以扫一眼就排完了序。但如果到几十个数字,这就有点麻烦了,因为如果没有一个必须严格遵守的流程,排完序经常会有些小错误。 问题:如何给班上50个同学的成绩排序? 在没有计算.

Debroon 801

卡门涡街可视化实战:从网格加密策略到动画后处理技巧

本文详细介绍了利用ANSYS Fluent进行卡门涡街可视化模拟的全流程,包括网格加密策略、求解器设置、涡街捕捉及动画后处理技巧。通过计算流体力学(CFD)方法,帮助工程师和研究人员高效模拟圆柱绕流现象,优化工程设计。

weixin_29309785的博客 414

手把手教你学Simulink——基于AI融合与智能调度的场实例:强化学习在卫星资源分配中的应用

本文详细介绍了如何利用Simulink和强化学习技术实现智能卫星资源分配。文章首先分析了低轨卫星通信系统面临的动态资源调度挑战,提出采用强化学习(特别是PPO算法)的解决方案。接着逐步展示了完整的建模过程:从Simulink项目创建、卫星通信环境建模(用户业务、信道特性、资源池),到强化学习任务定义(状态空间、动作空间、奖励函数),再到PPO智能体的构建与训练。最后通过仿真验证,PPO智能体在系统吞吐量、公平性和阻塞率等关键指标上均优于传统方法。该方案为卫星通信系统的智能资源管理提供了可行方案,并支持进一步

MHD0815的博客 190

【排序算法详细介绍】桶排序(Bucket Sort)冒泡排序(Bubble Sort)快速排序(Quick Sort)

详细介绍了桶排序,冒泡排序以及快速排序,std::sort

TYJhhxx的博客 1843

2026年全国青少年信息素养大赛复赛真题(算法应用主题赛C++小学组:带解析)(7月4日试卷一)【文末附答案和解析】

2026年全国青少年信息素养大赛复赛真题(算法应用主题赛C++小学组:带解析)(7月4日试卷一)【文末附答案和解析】

王老师青少年编程 1735

基础排序算法整理-超级简单易懂 python

排序算法整理简介冒泡排序快速排序简单插入排序三级目录 简介 十种常见的算法可以分为两种: 第一种是比较类排序,也成为线性排序,其时间复杂度不能超过O(nlogn) 第二种是非比较类排序,不通过比较来决定元素间的相对排序,时间复杂度可以超过O(nlogn) 那么各个方法的复杂度如下: 冒泡排序 冒泡算法的思想是: 指针从第一个数开始与其后面一个数进行比较 如果后面一个数较大,则指针指向后面一个数;如果前面一个数较大,则两个数交换位置,指针指向大的数 直到最大的数放到了最后一个位置,指针从头开始重复

weixin_43494312的博客 340

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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...

【排序算法】快速排序超级总结

快速排序 一、介绍   快速排序和合并排序有点类似,两者可以相互比较。快速排序也是像合并排序那样将整个序列分成两段分别进行排序。但是快速排序没有合并排序的合并过程。      该算法是1960 年C.A.R.Hoard提出的一个非常好的排序算法。快速排序算法需要选择一个划分元素,把小于划分元素的元素放在它的左边,大于它的元素放在右边,这样就分成了左右两端,在对左右两段进行排序。 从

xiaoding133的专栏【Stay hungry,Stay foolish】 1967

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数据结构——排序的超级详解(Java版)

史上最全的排序,Java版,博主花费了很长时间搞出来的,大家一起学习

HANhylyxy的博客 1119

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

整理排序算法 java

这是之前不知道什么时候从网上截图下来的,找不到出处了,超级棒的笔记冒泡排序//冒泡 public void bubleSort(int[] nums) { for (int i = 0; i < nums.length - 1; i++) {//循环n-1次,每循环完一次,冒泡得一个最大值 for (int j = 0; j < nums.length

IncludeLayout的博客 329

排序算法:归并排序详解(含动图与代码)

归并排序(merge sort)是高效的基于比较的稳定排序算法。

m0_61360607的博客 464

归并排序超级细致讲解

面试必备技能之一:归并排序。 本文进行超级细细细的讲解!

Nimrod__的博客 408

Python内置排序算法Tim Sort:工业级排序库的设计哲学与实践

排序算法是数据处理的基础,其核心目标是在不同数据特征下实现效率、稳定性和内存使用的平衡。传统算法如快速排序和归并排序各有优劣,但在面对现实世界中部分有序、类型混杂的数据时往往难以兼顾。Tim Sort作为一种自适应混合排序算法,通过识别数据中的自然有序片段(run)并智能合并,在工程实践中实现了性能优化。该算法结合了插入排序对小规模数据的高效性和归并排序的稳定性,特别适用于Python这类动态语言中的通用排序场景。其设计体现了利用数据固有特性、混合策略优化以及为常见情况设计的工程思维,为处理真实世界数据提供

weixin_33896726的博客 370
上一篇: 链表的三种构造方法
下一篇: 【排序算法】快速排序超级总结
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值