算法-排序-归并排序(MergeSort)分析

K型热电偶分度表读取方法 阅读详情
题目:算法-排序-归并排序(MergeSort)分析
摘要:
此文介绍了归并排序的算法以及基本分析,最后总结。
此系列文均为方便日后重复粗略查看时不必翻看书籍。
 
由于该算法比较简单,所以直接给出算法导论中的算法伪代码。后续将着重算法分析。
算法过程
merge sort过程 ([2],P19)
MERGE-SORT(A, p, r)
1 if p < r
2   then q ← ⌊(p + r)/2⌋
3        MERGE-SORT(A, p, q)
4        MERGE-SORT(A, q + 1, r)
5        MERGE(A, p, q, r)
 
merge sort中用到的合并过程 ([2],P17)
MERGE(A, p, q, r)
n1q - p + 1
n2r - q
 3  create arrays L[1 ‥ n1 + 1] and R[1 ‥ n2 + 1]
for i ← 1 to n1
 5       do L[i] ← A[p + i - 1]
for j ← 1 to n2
 7       do R[j] ← A[q + j]
L[n1 + 1] ← ∞
R[n2 + 1] ← ∞
10  i ← 1
11  j ← 1
12  for kp to r
13       do if L[i] ≤ R[j]
14             then A[k] ← L[i]
15                  ii + 1
16             else A[k] ← R[j]
17                  j ← j + 1
 
算法分析
定理1.1将N个元素的数组排序,,归并排序使用N*lgN+O(N)次比较。([1],P4)
证明:设C(N)为N个元素排序所用的比较次数。则排序前一半所用的比较次数为C( N/2), 排序后一半所用的比较次数为C( (N+1)/2)。[除法结果小数点后面位数直接去掉]。合并的比较次数为N(对于两个子数组的每个元素都有一次比较)。下面关系式可以精确描述归并排序的比较次数:
C(N)=C(N/2) + C( (N+1)/2) +N (N>=2, C(1)=0)  (1-1)
 
考虑N是2的幂时的情况,
C(2n) = C(2n-1)+C(2n-1)+2n=2C(2n-1)+ 2n
两边除以2n,我们发现
C(2n)/2n= C(2n-1)/ 2n-1 + 1 = C(2n-2)/ 2n-2 + 2 = C(2n-3)/ 2n-3 + 3 = … =  = C(20)/ 20 + n = n
即: C(2n) = n*2n , ,这就证明了当N=2n ,C(N)=lg(N)*N ;
对于一般的N,定理可以通过式(1-1)归纳证明。[1]的第二章详细讨论了如何求解这样的递推关系。
TODO:添加[1]中chapter2对该定理一般的N的求解过程
 
式C(N)=C(N/2) + C( (N+1)/2) +N在[2]中的递归表示为:
 
clip_image002[4] (2.1)
为了将和,将上述公式重写为:
clip_image004[4] (2.2)
C表示规模为1的问题所需的时间,即比较合并步骤中每个数组元素所需的时间。
注意:由于该表达式比较特殊(或者说相对简单),[2]在P22给出了一个形象的以树的方式将该公式进行了多重分解,最后得出总的代价为 clgn+cn,即:clip_image006[4],此树形递归分解方法应该作为一种基本的sense印记在脑中。
[2]中上述公式可以作为Chapter4中的主定理(Master Method)的一种情形来解决。
TODO:添加[2]主定理中该情形处理方式
 
总结
由上述公式(源于[1]和[2])及其处理过程,我们可以看出
1.  此算法极其简单,非常合适算法入门中第一个介绍。[1],[2]基本上都是。
2.  此算法的算术表达方式极大的方便了对其复杂度的分析。算术表达式算法分析的根本。没有表达式,想破头也是非常困难的。
3.  运用一些形象的表示方法,也是可以处理一些简单的算术表达式的。如通过递归树的方式将[2]的公式最终解出复杂度。
4.  掌握一定的数学思考问题,解决问题方式是非常有必要的。
5.  平时要多注意数学素养,数学思维的运用。流水不腐、户枢不蠹。脑子越用越灵活。
 
参考文献:
[1]. 算法分析导论 Section1.2 计算复杂性, 
[2]. 算法导论,CH,V2,  Section 2.3.1分治法
 
芒果YOLOv8改进160:姿态估计Head篇:即插即用|轻量化非对称多级压缩LOADH旋转检测头,原创改进适配YOLOv8高效检测头,检测头新颖改进,全网首发独一份 芒果YOLOv8改进159:OBB旋转检测头Head篇:即插即用|轻量化非对称多级压缩LOADH旋转检测头,原创改进适配YOLOv8高效检测头,检测头新颖改进,全网首发独一份 阅读详情

相关推荐

基于C++的Merge Sort分治排序算法实战详解

当数据无法全部加载进内存时(如 TB 级日志文件),Merge Sort 成为核心组件。流程如下:分批读取固定大小的数据块内存中排序后写回临时文件执行多路归并,逐段读取各文件头部,输出有序结果此方法广泛应用于数据库引擎、搜索引擎索引构建等系统。

weixin_36382073的博客 1116

算法设计与分析(屈婉玲)视频笔记day2

• 序列求和基本公式: 等差数列 等比数列 调和级数 • 估计序列和: 放大法求上界 用积分做和式的渐近的界 • 应用:计数循环过程的基本运算次数

weixin_60257072的博客 1655

归并排序MERGESORT

********************************************************** 合并排序伪代码如下: MERGE(A, p, q, r) 1 n1 ← q - p + 1 2 n2 ← r - q 3 create arrays L[1 ‥ n1 + 1] and R[1 ‥ n2 + 1] 4 for i ← 1 to n1 5 do L[i] ← A[p + i - 1] 6 for j ← 1 to n2 7 do R[j] ← A[q + j] 8 L[n1 + 1] ← ∞ 9 R[n2 + 1] ← ∞ 10 i ← 1 11 j ← 1 12 for k ← p to r 13 do if L[i] ≤ R[j] 14 then A[k] ← L[i] 15 i ← i + 1 16 else A[k] ← R[j] 17 j ← j + 1 MERGE-SORT(A, p, r) 1 if p < r 2 then q ← ??(p + r)/2?? 3 MERGE-SORT(A, p, q) 4 MERGE-SORT(A, q + 1, r) 5 MERGE(A, p, q, r) *********************************************************/

算法归并排序算法merge sort)

归并排序算法 1.算法原理 归并排序算法是分治法(Divide-and-Conquer)的典型应用。其操作的步骤如下: Divide:把n个元素的序列分为两个元素个数为n/2的子序列。Conquer:递归的调用归并排序算法对两个子序列进行排序Combine:对排好序的子序列进行合并,得到最后排序的结果。 归并算法用示意图表示如下: 归并排序算法的伪代码如下: M

Second的专栏 1万+

归并排序MERGE-SORT)

归并排序算法完全遵循分治模式。直观上其操作如下: 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。 解决:除非分解后得到的两个子序列的元素个数为1,否则继续使用归并排序递归地排序两个子序列。 合并:合并两个已排序的子序列以产生已排序的答案。 当待排序的序列长度为1时,递归“开始回升”,在这种情况下不要做任何工作,因为长度为1的每个序列都已排好序。归并排序算法的关键操作是“合并

supermouse的博客 675

归并排序

归并排序Merge Sort)是分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列之间有序。将两个有序数组合并成一个有序数组,称为二路归并(binary merge)。 图解为实现的思路。(图是借来的) public class MergeSortThree { public static ...

qq_43382364的博客 133

Python实现冒泡排序、选择排序、插入排序、快速排序归并排序、二分法查找算法(基于《算法导论》伪代码)

为加深对各种基础排序算法的理解,我基于Thomas H. Cormen等《算法导论》中的伪代码,用Python实现了冒泡排序、选择排序、插入排序、快速排序归并排序、二分法查找算法。 具体算法如下: 冒泡排序: def bubbleSort(alist): for passnum in range(0, len(alist) - 1, 1): for i in

vernice的专栏 9601

算法分析与设计】归并排序(MergeSort)

归并排序一般是我们学习的第二种排序算法,比插入排序精明的同时,也比插入排序难理解了许多,因为它包括了分治的策略。 先来看伪代码: 我们还需要一个Merge()函数: 值得一说的是,在我们用新建的数组L,R将A中的元素存储完毕后,需要在L,R的最后加一个很大很大的数,比如说INT_MAX这样的数,作为其中一个数组结束后的哨兵。 MergeSort函数就是一个递归分治 最后合并的过程。只要p是小于...

ecnu_lmxgofgt的博客 1154

算法设置与分析归并排序算法MergeSort

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。[cpp] view plain copy//将有序数组a[]和b[]合并到...

BigCowPeking 365

结合内存分析java归并排序_排序算法归并排序Mergesort)解析

一.归并排序的优缺点(pros and cons)耗费心思来理解它,总要有个理由吧:归并排序的效率达到了巅峰:时间复杂度为O(nlogn),这是基于比较的排序算法所能达到的最高境界归并排序是一种稳定的算法(即在排序过程中大小相同的元素能够保持排序前的顺序,3212升序排序结果是1223,排序前后两个2的顺序不变),这一点在某些场景下至关重要归并排序是最常用的外部排序方法(当待排序的记录放在外存上,...

weixin_28894691的博客 478

数据结构与算法分析-C++描述 第7章 归并排序mergeSort

归并序(mergeSort): 归并排序以最坏情形运行时间运行,所使用的比较次数几乎是最优的,而且是递归算法很好的例子。归并排序的基本操作是合并两个已排序的表。因为这两个表是已经排序的,所以若放到第三个表中,则该算法可以通过对输入数据的一趟排序来完成。 行为描述: 算法描述: 取两个输入数组A数组B、一个输出数组C及3个计数器(),它们的...

qq_37172182的博客 459

算法分析-归并排序

MergeSort分析归并排序,三路归并排序实现,三路归并分析

weixin_36994568的博客 1130

通过归并排序算法mergesort)理解递归在程序中的运行过程

递归的重要性不言而喻,它是很多算法实现的基础,比如含有分治思想的算法归并排序,二分查找),有关遍历二叉树的算法,或者求解数学递推式的算法(斐波那契数列,n的阶乘),回溯法,动态规划等等, 一提到递归总有点发蒙,理论上比较好理解,但是一遇到复杂一点的递归算法,在大脑中很难想象递归在计算机中是怎么实现的。跟着一步步debug才终于搞明白,所以在这里先把过程给记录下来。 归并排序算法...

fgao2的博客 1589

归并排序 mergesort

#include <iostream> #include <vector> #include <stdlib.h> #include <chrono> #include <cmath> #include <algorithm> template <typename T> inline void swap(T * t1, T * t2) { T tmp = *t1; *t1 = *t2; *t2 ..

u014789533的博客 1万+

MergeSort与QuickSort的详细分析

 MergeSort和QuickSort是两种比较类似的sort方式,他们都是通过Divide and Conquer来实现的。都需要使用recursion的方式进行排序。他们的相同之处在于原理上一致。首先要做的是split,将N个element分成两部分进行排序,每一部分也会再继续分成两部分排序,直到只有2个element的时候就可以很容易的比较排序。这个就是recursion的使用方法。属于D

QT_pixie的专栏 1万+

算法设计-归并排序(C++)

归并排序是一种基于分治法的高效排序算法,其核心思想是将数组分成两个子数组,分别排序后再合并。时间复杂度为 O(nlog⁡n),空间复杂度为 O(n)。:循环变量,分别用于遍历左子数组、右子数组和原数组。函数是归并排序的主函数,用于递归地对数组进行排序。,表示当前子数组至少有两个元素,需要进行排序。:临时数组,分别存储左子数组和右子数组。函数用于合并两个已排序的子数组。函数合并左右子数组。:子数组的起始索引。:子数组的中间索引。:子数组的结束索引。:子数组的起始索引。:子数组的结束索引。

duibuqiwoshijing的博客 623

归并排序怎么写,看这里( MergeSort 和 _MergeSort

//归并排序是将两个已经排好序的数列,以某一种顺序整合在一起的排序算法 //前提是要有两个已经排好序的数列! //_MergeSortMergeSort函数的一个子函数,通过不断地分治到单独的数上 //来为归并算法提供前提,使要归并的两个数列有序 //通过_MergeSort函数反复的递归调用来实现将一个无序的数列排好序 //tmp开辟出来的空间的作用是: //将排好序的数列放到tmp开辟的空间中,然后再将tmp空间里的数列放到原数组中 //实现了一个替换的作用 void _Me

zjybp的博客 652

归并算法的存储分析

归并算法的存储分析 函数分析mergesort函数需要四个参数:分别是原数组,起始位置,终止位置,存储数组。在调用时,原数组和存储数组相同,即排序后数据最后仍保留在原数组。 merge函数需要五个参数,它的作用是归并两个有序数组,初始需要五个参数,分别是起始位置,中点,终止位置。 空间存储关系分析:由于归并排序需要额外的空间来存放临时数据,所以在此分析数据在空间中的传递过程。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include

NPUNEBULA的博客 329

高级排序归并排序

while (i <= m && j <= r) {//i为第一段首元素,j为第二段首元素,比较两个元素大小进行排序。递的过程利用二分法取有效基准数将数组分为[begin,mid],[mid+1,end]两个区间,分别进行递的操作。//[begin,mid],[mid+1,end]把两个小段有序的序列合并成大段。//再把合并好的大段有序的结果,拷贝到原始arr数组[l,r]区间内。//开辟额外的空间将两小段有序的序列合并成大段。最坏时间复杂度:O(n*logn)//归并排序递归接口。空间复杂度:O(n)

jester666的博客 419

排序算法总结

给大家分享一些关于HTML的面试题,有需要的朋友可以戳这里获取,先到先得哦。获取!!(备注:前端)**给大家分享一些关于HTML的面试题,有需要的朋友可以戳这里获取,先到先得哦。[外链图片转存中…(img-hRgAgz53-1713320307904)][外链图片转存中…(img-PEw0sGEi-1713320307904)]

2401_84094979的博客 1060

国家企业信用信息公示系统全量数据采集与分析平台_工商企业注册信息_经营异常名录_严重违法失信企业名单_失信被执行人数据_裁判文书网判决文书_企业变更记录_知识产权信息_董事会成员信.zip

国家企业信用信息公示系统全量数据采集与分析平台_工商企业注册信息_经营异常名录_严重违法失信企业名单_失信被执行人数据_裁判文书网判决文书_企业变更记录_知识产权信息_董事会成员信.zip

上一篇: 算法-排序-快速排序(QuickSort)分析
下一篇: Tips from Manish Sharma about how to writing your own FIX engine
winnerbao
博客等级 码龄24年 8粉丝 36原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值