算法导论之二归并排序法

算法导论 学习笔记 第四章 递归 Θ(n(logba))\Theta(n^{(log_b a)}) Θ(lga)\Theta(lga)这一章主要是介绍了三种求运行时间的方法。这三种方法都是解决递归问题的。就像分治法这种问题的算法的运行时间。这三种方法分别是替换法/递归树方法/主方法 4.1替换法(The substitution method)这个方法有两个步骤: 1.猜一个答案 而比较悲催的是现在没有一个通用的方法去猜正 阅读详情

分治法的思想是将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。

归并排序算法完全遵循分治模式,操作步骤如下:

分解:将待排序的n个元素的序列分解为分别具有n/2个元素的两个子序列。

解决:使用归并排序递归地排序两个子序列。

合并:合并两个已排序的子序列以产生已排序的原序列。

“合并”操作中通过调用一个辅助过程MERGE(A,p,q,r)来完成,其中A是一个数组,p,q和r是数组下表,满足,该过程假设子数组A[p..q]和A[q+1..r]都已排好序。该过程合并这两个子数组形成单一的已排好序的子数组并代替当前子数组A[p..r]。

伪代码如下,需要注意,在每个子数组的末尾增加一张哨兵值,以避免在每个基本步骤中必须检查是否子数组为空:

MERGE(A,p,q,r)

n1 = q – p + 1             //计算子数组A[p..q]的长度n1

n2 = r – q                    //计算子数组A[q+1 ..r]的长度n2

//创建长度分别为n1+1和n2+1的数组L和R,数组的额外位置保存哨兵值

let L[1..n1+1] and R[1..n2+1] be new arrays  

for i = 1 to n1

  L[i] = A[p + i - 1]           //将子数组A[p..q]复制到L[1..n1]

for j = 1 to n2

  R[j] = A[q + j]       //将子数组A[q+1 ..r]复制到R[1..n2]

L[n1 + 1] =

R[n2 + 1] =           //将哨兵值放在数组L和R的末尾

i = 1

j = 1

//在开始循环的每次迭代时,子数组A[p..k-1]按从小到大的顺序依次包含L和R中的k-p个//最小元素,进而,L[i]和R[j]是各自所在数组中未被复制回数组A的最小元素

for k = p to r

if  L[i] <= R[j]

    A[k] =L[i]

    i = i + 1

else

   A[k] = R[j]

    j = j + 1

 

下面的过程MERGE-SORT(A,p,r)排序子数组中A[p..r]中的元素,其中将MERGE过程作为归并排序算法中的一个子程序来应用:

MERGE-SORT(A,p,r)

if  p< r

   q=

  MERGE-SORT(A,p,q)

  MERGE-SORT(A,q+1,r)

  MERGE(A,p,q,r)

 

程序代码如下:

#include "stdio.h"

#include "stdlib.h"

#define MAX 10

 

void print_array(int *array_test,unsignedint x)

{

         unsignedint i;

         for(i=0;i<x;i++)

         {

                   printf("%d",array_test[i]);

         }

         printf("\n");

}

 

static void merge(int array[],int low,intmid,int high)

{

         inti,k;

 

         //申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

         int*temp=(int*)malloc((high-low+1)*sizeof(int));

 

         intbegin1=low;        //左半边开始下标

         intend1=mid;  //左半边结束下标

         intbegin2=mid+1;   //右半边开始下标

         intend2=high; //右半边开始下标

 

         printf("mid=%d",mid);

 

         k=0;

 

         while(begin1<=end1 && begin2<=end2)

         {

                   //左右两边分别比较,并且一次存入临时数组

                   if(array[begin1]<array[begin2])

                   {

                            temp[k++]=array[begin1++];

                   }

                   else

                   {

                            temp[k++]=array[begin2++];

                   }

         }

 

         //若第一个序列有剩余,直接拷贝出来粘到合并序列尾

         while(begin1<=end1)

         {

                   temp[k++]=array[begin1++];

         }

 

         //若第二个序列有剩余,直接拷贝出来粘到合并序列尾

         while(begin2<=end2)

         {

                   temp[k++]=array[begin2++];

         }

 

         //将排序好的序列拷贝回数组中

         for(i=0;i<(high-low+1);i++)

         {

                   array[low+i]=temp[i];

         }

 

         printf("合并: ");

         print_array(array,MAX);

         free(temp);

}

 

void merge_sort(int array[],unsigned intfirst,unsigned int last)

{

         intmid=0;

         if(first<last)

         {

                   mid=(first+last)/2;

                   merge_sort(array,first,mid);   //划分左半部分

                   merge_sort(array,mid+1,last);        //划分右半部分

                   merge(array,first,mid,last);    //合并

         }

}

 

int main()

{

         intarray_test[MAX]={0,9,8,4,3,2,1,5,6,7};

         printf("start:");

         print_array(array_test,MAX);

         merge_sort(array_test,0,9);

         printf("end:");

         print_array(array_test,MAX);

         return0;

}

IEC61850客户端连接实战:CMS vs MMS协议抓包对比与性能初探(基于YX-PIS协议栈) 本文深入探讨了IEC61850客户端连接中CMS与MMS协议的抓包对比与性能优化。通过Wireshark抓包分析、协议栈配置实战和性能基准测试,揭示了两种协议在连接建立、数据交互和性能调优方面的关键差异,为智能电网自动化系统的协议选择提供了实用指南。 阅读详情

相关推荐

8.5/Q1,Charls最新高分文章解读!

8 257名受试者中,672人(8.14%)在9年内发生过卒中。在调整的多因素cox回归模型中,TyG和ABSI仍然是卒中的预测因素,TyG的HR为1.25(95%CI:1.06~1.47),ABSI的HR为1.33(95%CI:1.06~1.68)。TyG和ABSI联合诊断效能最高(AUC:0.579,95%CI:0.553~0.597),而TyG(AUC:0.566,95%CI:0.544~0.587)和ABSI(AUC:0.533,95%CI:0.524~0.597)的诊断效能最低。

gsky_sci的博客 1014

「算法原理与实现」归并排序

一、分治模式 许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决紧密相关的若干子问题。这些算法典型地遵循分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题。递归的求解这些问题,然后再合并这些子问题的解来建立原问题的解。 分治模式在每层递归都有三个步骤: 分解原问题为若干子问题,这些子问题是原问题的规模较小的实例。 解决这些子问题,递归地...

平凡 381

Plecs仿真进阶:半桥LLC谐振变换器从开环到闭环的实战解析

本文通过Plecs软件,详细解析了半桥LLC谐振变换器从开环模型搭建到闭环控制实现的完整仿真流程。文章深入探讨了谐振参数设置、关键波形解读,并重点分享了基于PI控制器的闭环调试实战经验与参数整定技巧,帮助工程师高效掌握这一高效拓扑的仿真与设计方法。

weixin_29231263的博客 278

归并排序算法

文章目录一.定义1.归并排序原理2.归并操作二.实现(递归,非递归)1.递归2.非递归三.时间复杂度分析 一.定义 1.归并排序原理 归并排序是建立在归并操作基础上的一种排序方式。归并操作:是指将两个已排序好的子序列合并成一个有序序列的过程。 归并排序基本原理:将大小为N的序列看成N个长度为1的子序列(长度为1的子序列我们认为是有序的), 接下来将相邻两子序列两两进行归并操作,形成N/2或(N/2)+1个长度为2或1的子序列; 然后再继续进行相邻子序列两两归并操作,如此一直循环, 直到剩下一个长度为N的序列

weixin_57023347的博客 880

【SOFA】SOFA框架+Win10+VS2019 配置

SOFA (Simulation Open Framework Architecture)官网 SOFA 是一个开源的仿真框架,用于实时的物理仿真,而且主要针对医学上的仿真。主要用于研究人员开发新的算法,也可以作为一个有效的快速成型工具或是物理引擎。 官网中给出的配置方法写的很清晰,有着各个库或者软件的版本要求,仔细看按版本要求来 官网配置地址 官网给了两种方 1.通过脚本自动配置 2. 自己下载相关库通过CMake进行生成 第一种 没使用,不知道是否好使,因为如果其中有下载的东西,国内不一定能成功,大家可

GordonWei 5260

Agent框架系列:1-低代码智能体平台深度解析Dify、Coze、n8n

Dify、Coze 和 n8n 是三大主流低代码智能体平台,各有侧重。Dify 适合企业级 AI 应用,具备强大的 RAG 和知识库管理能力,技术栈为 Python + React。Coze 由字节推出,主打零代码和快速原型开发,集成 60+ 插件,极适合非技术用户。n8n 以工作流自动化和系统集成为核心,支持 400+ 外部应用,基于 Node.js + Vue,扩展性极强。选择建议:非技术团队选 Coze,AI 应用选 Dify,复杂自动化与集成选 n8n。可根据实际需求混合使用,最大化平台优势。

3078

排序之归并排序

排序之归并排序 简介 归并排序是将n个元素的数组分割为2个n/2的数组进行排序,再通过merge进行合并成一个数组。 思路 1.先编写 void mergeSort(int[] nums,int left, int right)主函数,这里首先判断 left+1 < right ,这里不能是left < right 否则会导致出现栈溢出。之后递归左右两个数组,再合并两个数组。这里大家可...

weixin_44268116的博客 312

手把手教你用Gazebo+ROS搭建智能小车机械臂系统(含完整配置文件)

本文提供了一份详细的实践指南,手把手教你使用Gazebo和ROS搭建智能小车机械臂仿真系统。内容涵盖从URDF/Xacro模型设计、Gazebo控制器配置到ROS话题通信与系统集成的完整流程,并提供了可复用的配置文件与调试技巧,帮助开发者快速构建并控制一个功能完备的移动操作机器人平台。

sugar的博客 971

【算法导论】归并排序

【算法导论】归并排序 标签(空格分隔):【算法导论】 什么是排序? 考虑对于给定输入的某一个数组 A={a1,a2,...,an}A = \{a_1, a_2,..., a_n\}A={a1​,a2​,...,an​}, 经过排序算法,我们可以得到原始排列的一个序列A={a1′,a2′,...,an′}A=\{a_1^{&#x27;}, a_2^{&#x27;},..., a_n...

grefwfdxz 463

论文阅读《Eigen-GNN: A Graph Structure Preserving Plug-in for GNNs》

好久没看论文了,感觉好生疏 关于这篇文章的大致脉络,这篇文章已经介绍过了。

且视他人之疑目如盏盏鬼火,大胆地去走你的夜路 461

FPGA工程师面试——FPGA基础知识24题

线与逻辑是两个输出信号相连可以实现与的功能。在硬件上,要用OC门(集电极开路与非门)来实现,由于不用OC门可能使灌电流过大,而烧坏逻辑门,因此在输出端口应加一个上拉电阻。

FPGA/MATLAB学习教程/源码/项目合作开发 1086

归并排序(递归详解)

归并排序(递归详解)

优快云_15987的博客 992

13.0 针对跳转不存在Activity崩溃处理,改成弹Toast提示,去掉崩溃弹窗,避免app崩溃退出

在开发过程中,在app跳转到某个没注册的Acitivity时,往往会出现崩溃的场景,这样也不好,接下来就从framework中来拦截这个崩溃,改成toast提示,

安卓兼职framework和app工程师的博客 48

算法导论学习:归并排序法的实现

上回学习了最简单也是最直接的插入排序。插入排序在小数据量时是很高效的,但是遇到大数据时,便显得无力了,今天来介绍归并排序,在大数据排序时,时间短,但同时它的空间使用率就显得高了。 第二章

qq_17256847的博客 1003

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

算法导论 排序

直接插入排序法 原理:从无序数列向左遍历,从有序数组向左比较 //插入排序法 void straightsort(int*arr,int len) { int temp,i,j; for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序 { temp=arr[i];//temp存放待插入元素 for(j=i-1;j>=0&&arr[j]>temp;j--

m0_58473523的博客 130

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

归并排序法

1、归并排序法(Merge Sort) --- 以下简称MS,是分治法思想运用的一个典范,其主要算法操作可以分为以下步骤: --1)将n个元素分成两个含n/2个元素的子序列 --2)用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列) --3)合并两个已排序好的序列 MS的关键在于Merge过程。对于这一过程的理解,算法导论中给出了一个形象的模型。即假设桌面上有两堆已排好序

dongyanxia1000的专栏 604

MIT算法导论第一课——插入排序与归并排序c++实现

最近开始重新温习C++以及学习麻省理工的算法导论课,然后以后会逐渐更新点所学到的东西。 第一天学习的主要是各种符号及概念。 然后主要讲了排序问题的时间复杂度,先来看看这两种算法的实现 插入排序法: 其算法原理就是按照顺序从数组中选择数字,与其之前的数字进行比较,直到遇到比自己小的数字就停下来,插在这个比自己小的数字之后,以此类推。实现函数如下: template<class ...

LInthunder的博客 435

《算法导论》个人笔记(一)

第一章主要介绍算法是什么,算法在计算中能起到什么作用。第二章主要介绍算法基础,讲了一个插入排序算法,同时介绍了如何分析算法的复杂度,还引入了分治法的思想,归并排序算法。另,包含一些练习题。

风不止步的博客 837

算法导论2.3-7的算法

题:一个长度为n的整数集合S,一个整数x,写一个算法,判断S中是否有两数之和等于x,时间复杂度要求O(nlgn) 解答如下: 1.算法思路:先用归并排序法对S进行排序,然后用二分查找法,查找S中有无等于x-S[i]的值 2.伪代码如下: bool CheckSums(S,p,r,x) { S<--sort(S);//用归并排序进行 for(int i=...

weixin_30814223的博客 109

第二章 算法导论

算法导论第二章

weixin_43886282的博客 220

算法导论小结(2)-归并排序与快速排序的比较

By:             潘云登Date:          2009-7-12Email:         intrepyd@gmail.comHomepage: http://blog.youkuaiyun.com/intrepydCopyright: 该文章版权由潘云登所有。可在非商业目的下任意传播和复制。对于商业目的下对本文的任何行为需经作者同意。写在前面

6998

算法导论学习笔记1

关于算法 ? 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。(能将算法写成程序,并让计算机准确无误地执行)。也...

168

ARTS打卡第6周

A: Subsets 题目:Given a set ofdistinctintegers,nums, return all possible subsets (the power set). Note:The solution set must not contain duplicate subsets. 题意:求一个不重复的数组的所有不重复的子集 思路:使用递归的方式求解,在对...

weixin_30608503的博客 144

算法导论读书笔记(2)

http://www.cnblogs.com/sungoshawk/p/3619541.html 算法导论读书笔记(2) 目录 分治法 归并排序 分治法分析 归并排序算法的分析 练习 2.3-22.3-42.3-52.3-7 思考题 在归并排序中对小数组采用插入排序逆序对 脚注 分治法 算法设计的方法有很多。插入

hkstorm的专栏 288

算法导论2.3-7答案

题:一个长度为n的整数集合S,一个整数x,写一个算法,判断S中是否有两数之和等于x,时间复杂度要求O(nlgn) 解答如下: 1.算法思路:先用归并排序法对S进行排序,然后用二分查找法,查找S中有无等于x-S[i]的值 2.伪代码如下: bool CheckSums(S,p,r,x) { S<--sort(S);//用归并排序进行 for(int i=...

weixin_30439131的博客 191
上一篇: 多线程
下一篇: 算法导论之一插入排序
mengrennwpu
博客等级 码龄15年 262粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mengrennwpu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值