排序算法总结(四)归并排序

排序算法(四)归并排序 算法描述: 通过将乱序的数据划分为某一长度的归并段,并使得归并段中的数据有序,然后在对归并段进行扩充,最后合并为一个有序的归并段。归并的核心思想运用的是分治法的思想,分的思想是将原始数据划分为若干个段,治的思想是分别对各个段进行排序。递归进行,直至整个数据合并为一个段。 这里实现的是二路归并,下面是二路归并实现的图解: 由图所示,采用分治法很容易就将乱序的数据排序好,而且归并排序的最好、最... 阅读详情

访问www.tomcoding.com网站,学习Oracle内部数据结构,详细文档说明,下载Oracle的exp/imp,DUL,logminer,ASM工具的源代码,学习高技术含量的内容。

归并排序的核心就是合并两个有序数组,生成一个有序的新数组。在一个数组中如果数字都无序,那么把这个数组拆成两个或四个数组,拆成的小数组都不能保证有序,如果继续拆下去,如果数组有n个元素,那么就拆成n个数组,这时每个数组只包含一个元素,这个单元素数组就是有序的了,然后把这些单元素数组两两合并,如果n是双数,那么正好两个配对,完成合并,如果n是单数,那么最后一个元素之前的正好两个配对,最后一个元素与之前合并好有序数组再合并,这样全部元素都合并成了有序数组。

我们来看合并两个有序数组的算法。算法原理很简单,在这里使用一个辅助数组c,两个有序数组分别叫做a和b,都设置一个指针指向首元素,首先a和b的首个元素进行比较,小的元素放到c数组的第一个元素,比较中第一个元素小的数组指针前进一个元素,这个元素又成了首元素,这样一直比较下去,小的元素放到c数组,指针往前移一个元素,直到两个数组中有一个指针移到了尾部,这时把没有移到尾部的数组剩余的元素依次放入c数组,这样c数组中的元素就都是有序的了。

在实际的应用中,往往a和b两个数组是一个大数组前后两部分,这时a和b是连在一起的,比如大数组有8个元素1,3,5,7,2,4,6,8,拆分成a和b两个数组,a的元素为1,3,5,7,b的元素为2,4,6,8,其实a就是大数组的首地址。所以上面的c数组中的元素要拷贝回a数组中,便于后面更大的有序数组合并。

合并函数如下。

/* ai是要合并的两个数组首地址

 * left是数组首元素下标,right是数组最后元素下标,mid是数组中间元素下标

 * 两个数组中的元素分别是left到mid,mid+1到right,这两个数组元素都是有序的

 * 比如ai={1, 3, 5, 7, 2, 4, 6, 8}, left=0, mid=3, mid+1=4,right=7

 * left到mid的元素是1, 3, 5, 7

 * mid+1到right的元素是2, 4, 6, 8

 * tmp是辅助临时数组地址

 */

void merge(int *ai, int *tmp, int left, int mid, int right)

{  

    int         i, j, k;

    /* i是左边数组的指针,j是右边数组的指针,

     * 从头开始比较,较小的元素放入辅助数组tmp中

     * 任何一个数组到达尾部,退出循环

     */

    for (i=left, j=mid+1, k=0; (i<=mid) && (j<=right); ) {

        if (ai[i] < ai[j])

            tmp[k++] = ai[i++];

        else

            tmp[k++] = ai[j++];

    }

    /* 左边的数组没比较完,把左边剩余的元素放入辅助数组 */

    while (i <= mid)

        tmp[k++] = ai[i++];

    /* 右边的数组没比较完,把右边剩余的元素放入辅助数组 */

    while (j <= right)

        tmp[k++] = ai[j++];

    /* 把辅助数组中的元素拷贝回原始数组中 */

    for (i=0, j=left; j<=right; j++, i++)

        ai[j] = tmp[i];

}

把数组中的每个元素拆分成单元素的数组,是在排序函数中完成的,使用递归的方式。函数如下。

/* ai是要排序的数组

 * left是数组第一个元素的下标,right是数组最后一个元素的下标

 * tmp是一个与ai大小相同的辅助数组

 */

void merge_sort(int *ai, int *tmp, int left, int right)

{

    int         mid;

    /* 左边的下标值与右边的相等了,

     * 表示数组中只有一个元素了,不要再拆分了

     */

    if (left >= right)

        return;

    /* 得到中间值 */

    mid = (left + right) / 2;

    /* 一直拆分左边的数组,直到每个数组包含一个元素

     * 这儿是递归调用,其实是每次到了这儿,又会调用自己把自己拆分成左右两个数组

     * 直到最后是单元素数组时,函数返回,这时又把小数组逐渐合并成大数组

     * 左半部分合并成有序的大数组后,才会继续下面的函数,又是拆分再合并的过程

     */

    merge_sort(ai, tmp, left, mid);

    /* 一直拆分右边的数组,直到每个数组包含一个元素 */

    merge_sort(ai, tmp, mid+1, right);

    /* 合并两个有序的数组,从小到大,直到合并成一个有序的大数组 */

    merge(ai, tmp, left, mid, right);

}

【2021工业图像异常检测文献】DRÆM: 基于判别性训练的重建嵌入表面异常检测方法 DRÆM – A discriminatively trained reconstruction embedding for surface anomaly detection 阅读详情

相关推荐

Anomalib实战指南:从零开始构建自定义异常检测数据集

本文提供了一份详细的Anomalib实战指南,指导用户从零开始构建自定义异常检测数据集。文章深入解析了数据准备的核心步骤、目录结构规范,并对比了PatchCore与FastFlow等关键模型的适用场景。通过清晰的代码示例,手把手演示了环境配置、模型训练与推理评估的全流程,旨在帮助开发者快速掌握这一工业视觉异常检测利器,有效解决实际生产中的缺陷识别难题。

weixin_29054245的博客 643

图解排序算法(四)之归并排序

基本思想   归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 分而治之   可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。 合并相邻有序子序列   再...

qq_40826814的博客 139

别再一个个BAPI调了!用CVI_EI_INBOUND_MAIN一次性搞定SAP BP主数据(附完整ABAP代码)

本文详细介绍了如何使用SAP标准函数CVI_EI_INBOUND_MAIN高效维护业务伙伴(BP)主数据,替代传统的多BAPI调用方式。通过完整ABAP代码示例,展示了如何一站式处理供应商、客户、公司代码等所有视图的创建与更新,提升数据一致性和开发效率。

weixin_29204205的博客 289

排序算法(四):归并排序

归并排序作为一种经典的分治算法,在处理大规模数据时展现了其强大的性能和稳定性。它通过递归地分割和合并来实现排序,其时间复杂度为O(n log n),是一个理想的稳定排序算法。尽管它的空间复杂度较高,且实现相对复杂,但在许多应用场景中,归并排序仍然是一个非常有效的排序工具。在选择排序算法时,我们可以根据实际情况选择合适的算法,例如对于大规模数据或者需要稳定排序的场景,归并排序无疑是一个优选。而对于小规模数据,插入排序或快速排序可能会更高效。

一碗黄焖鸡三碗米饭的博客 1249

基于STM32的PID恒温恒湿控制系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6核心控制器,完整实现了基于双路PID算法的恒温恒湿闭环控制系统,覆盖高精度温湿度采集、双模式控制、参数在线配置、异常安全保护、掉电记忆等全功能,全程采用无跳步保姆式教学,从硬件选型、接线、CubeMX配置、代码开发、调试排坑全流程拆解,跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 345

汇川机器人与PLC通信-ModbusTCP超详细案例

通过汇川机器人与PLC的ModbusTCP通信项目案例,我们可以了解通讯配置的过程,地址映射的方式,对接信号的转换,运行时序的逻辑等注意事项,帮助我们快速应用到项目中。

weixin_44166380的博客 1万+

排序算法(四)——归并排序

排序算法(四)简介递归归并排序迭代归并排序总结 简介 什么是归并排序? 归并排序就是将有n个记录的数据看做n个子序列,两个两个进行排序,然后合并,如此往复,直到形成n个记录的有序序列。这叫做2路归并排序。 归并排序和希尔排序? 归并排序将每次进行比较的子序列长度从1逐渐增加到n/2附近; 希尔排序将每次进行比较的子序列长度从n/3+1逐渐降低到1. 二者的算法复杂度都是O(nlogn)。具体来说,前者为O(nlog2n),后者为O(nlog3n). 提示:以下是本篇文章正文内容,下面案例可供

weixin_40534145的博客 894

【Microchip】微芯 MPLAB® X IDE开发环境新建项目(点亮1颗LED灯)(常用右键菜单快捷键)

1.新建项目2. 选择芯片型号和调试器3.选择编译器4.项目命名和选择文件路径5.新建成功,给项目添加main.c7.将新建的mainXC16.c文件添加进项目6000000UL这三个就是。

Naiva的博客 446

Java排序算法总结之(四)——归并排序

排序方法可以分为两种:内部排序 和 外部排序 内部排序的方法很多,常用的大致可以分为: 插入排序(直接插入排序、折半插入排序、希尔排序)交换排序(冒泡排序、快速排序)选择排序(简单选择排序、堆排序)归并排序基数排序 归并排序: 基本思想:将两个或两个以上的有序表组合成一个新的有序表。 归并的思路很好理解,有下面的示例: 示例:             Java代码: pu

Appletable的博客 3143

uniapp - 实现安卓App打包上架应用商店详细教程,详解Hbuilder打包编译apk发布上传到应用市场全流程,提供uniApp云打包、离线打包app、原生本地打包,附带APP备案和安卓证书申请

uni-app,安卓,APP,应用商店,打包编译apk,上架到应用市场,如何打包app并发布到主流应用市场,发布为AndroidApp流程,应用备案,如何申请安卓证书,hbuilder发布安卓apk后怎么上传到各家软件商店,创建app证书,uniapp发行原生APP本地打包安卓APK,详细最全的步骤教程,项目打包成apk,云打包,安心打包,安卓app离线打包,一直审核不通过,被拒绝,不符合规范,上架发布失败,申请安卓证书和获取证书信息,uni-app打包发布安卓Android软件到各大应用商店,腾讯应用

🏆 前端领域优质创作者 1万+

黑猫带你学UFS协议第17篇:UFS安全模式详解(Secure Mode)

本文详细介绍了UFS协议中的安全模式,包括Erase, Discard, Purge和Wipe Device操作。Erase用于永久删除数据并确保无法恢复;Discard不保证数据清除;Purge类似于Sanitize,清除内部未映射的物理块数据;Wipe Device则是格式化设备。这些操作涉及逻辑单元、擦除单位、相关寄存器配置等,确保数据安全。" 126036669,12409270,MySQL 8.0 开窗函数详解,"['数据库理论', 'SQL']

黑猫奥利奥的博客 2559

排序算法之四归并排序

1:归并排序算法 #include using namespace std; //归并排序算法 //1一次归并算法 void Merge(int r[],int s,int m,int t) { int i,j,k,n1,n2; n1=m-s+1; n2=t-m; int *left=NULL, *right=NULL; left = (int *)malloc(sizeof(i

679

建行报专版报道建设银行金融科技发展历程

经过十多年的建设,总行前中后台部门都有了自己的业务系统,但系统“部门”特征显著,渠道、客户、产品的横向整合不足,产品系统层次化、结构化、参数化程度不高,渠道支持产品快速部署以及跨渠道服务能力不足,管理分析类系统建设相对滞后,系统较弱的可扩展能力在应对高速增长的交易量时已疲态尽显,同时安全稳定运行的压力和风险日益积聚。站在新的历史起点上,科技条线将聚焦主责主业,完善信息科技管理体系,紧紧围绕安全生产中心任务,持续推动技术能力复用共享和自主可控,为全行做好金融五篇大文章,推动业务高质量发展提供技术支撑。

银行信息系统应用架构详解 383

经典排序算法(四)归并排序

自顶而下的归并排序 自底向上的归并排序

garbage_man的博客 301

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

漫谈经典排序算法:四、归并排序(合并排序)

1、序言 这是《漫谈经典排序算法系列》第四篇,解析了归并排序。  各种排序算法的解析请参考如下: 《漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析》 《漫谈经典排序算法:二、各种插入排序解析及性能比较》 《漫谈经典排序算法:三、冒泡排序 && 快速排序》

Touch_2011的专栏 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

常见的排序算法(四):归并排序

归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为O(n·log n)。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。 采用分治法: 分割:递归地把当前序列平均分割成两半。 集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)。 归并...

weixin_30275415的博客 157

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

<排序算法四>快速掌握“(2路)归并排序”

快速掌握递归排序的递归、非递归实现,复杂度

a1302993809的博客 1437

排序算法代码实现(四)—— 归并排序

本篇内容: 归并排序 归并排序 算法思想: 将两个或两个以上的有序表合并成一个新的有序表, 即把待排序序列分成若干个子序列,每个子序列是有序的,然后在把有序子序列合并为整体有序序列. 此算法分为两步: (1)把数组等长切分; (2)把切分后的数组进行排序,然后合并; 通过切分方法的递归调用,可以将数组切分到最小(2个元素)的组合; 代码: (1)合并两...

CherishTheYouth的博客 282

排序算法之四 归并排序(C++版本)

一. 实现原理 插入排序的相关知识,参考漫画:什么是归并排序? 二. 具体实现 void Merge(int* pData, int* pTemp, int start, unsigned int middle, unsigned int end) { unsigned int start1 = start, end1 = middle; // 第一个序列的起止位置 unsigned int...

xupeng1644的博客 1669

排序算法(四)——归并排序与递归

基本思想 分析归并排序之前,我们先来了解一下分治算法。 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。 分治算法的一般步骤: (1)分解,将要解决的问题划分成若干规模较小的同类问题; (2)求解,当子问题划分得足够小时,用较简单的方法解决; (3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解...

不吃_花椒的博客 330
上一篇: 排序算法总结(三)希尔排序
下一篇: 从零开发一个自己的Oracle DUL软件
tomcoding
博客等级 码龄9年 410粉丝 56原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值