排序算法:归并排序(Merge Sort)

使用C#详解常用排序算法(三):归并排序(Merge Sort) 结合C#代码讲解归并排序。 阅读详情

归并排序

归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解。

归并排序将排序数组A[1…n]分成两个各含n/2个元素的子序列,然后对这个两个子序列进行递归排序,最后将这两个已排序的子序列进行合并,即得到最终排好序的序列:

在这里插入图片描述

**归并排序的时间复杂度为:O(nlgn),其中 MERGE(a,b,c,d)的时间复杂度为O(n)。**如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。

  • 将n个元素分成各含有n/2个元素的子序列.
  • 对两个子序列递归排序.
  • 合并两个已排序的子序列以得到排序结果

.

void merge(int x,int y){
    if(x==y)return;
    int mid=(x+y)/2,i=x,j=mid+1,k=x;
    merge(x,mid),merge(mid+1,y);
    while(i<=mid&&j<=y){
        if(a[i]<=a[j]){
            c[k++]=a[i++];
        }else{
            c[k++]=a[j++],ans+=mid-i+1;
        }
    }
    while(i<=mid)c[k++]=a[i++];
    while(j<=y)c[k++]=a[j++];
    for(int l=x;l<=y;l++){
        a[l]=c[l];
    }
}

归并排序的缺点:不是原地排序,需要额外申请空间来进行排序。

排序算法系列:归并排序(Merge sort)(C语言) 通俗理解:运用分而治之的思想,编写递归函数,将大数组排序转化为小数组排序,最后再将其合并。void merge_sort(int*p,int low,int high) { int mid = (low+high)/2; if (low <high) { merge_sort(p,low,mid); merge_sort(p,mid+1,high); merge(p,low,mi 阅读详情

相关推荐

数据结构:排序算法之归并排序Merge Sort

本文详细介绍了归并排序算法。首先澄清了冒泡排序和归并排序的提出者分别是查尔斯·安东尼·理查德·霍尔和冯·诺伊曼,并纠正了"归并"的正确读音。文章通过示例数组arr[8]={2,3,7,4,1,8,6,5}详细展示了归并排序的分治过程:将数组递归分成两半排序,再合并有序子数组。给出了完整的C++代码实现,包括merge和mergesort函数。复杂度分析指出归并排序的时间复杂度为O(nlogn),空间复杂度为O(n),且最好最坏情况相同。文章包含大量代码和详细排序过程说明,总计4029字。

2401_84010520的博客 831

IsaacLab从入门到精通(二) 导入自定义机器人

IsaacLab系列第二讲,导入自定义的机器人及设置

DejaWu33的博客 8467

【STM32篇】DRV8425驱动步进电机

【STM32篇】在上篇文章中使用了HR4988实现了步进电机的驱动,在实际运用过程,4988驱动步进电机会存在电机噪音太大的现象。本次将向各位友友介绍一个驱动简单且非常静音的一款步进电机驱动IC。

we_long的博客 3068

一文读懂客户健康度

什么是客户健康度?客户健康度为什么重要?怎么计算客户健康度?这篇文章,我们来聊聊。

m0_62700043的博客 1420

初识机会网络仿真器ONE中ExternalMovement移动模型(导入外部移动数据)

最近半个月一直在研究ONE中关于ExternalMovement移动模型的源代码,在网上几乎没有找到相关的资料,很是苦恼,如果有共同研究方向的小伙伴欢迎联系我,共同讨论进步。 下面记录一下几点感悟: 1、使用外部数据的前提是在ONE的配置文件中增加及修改相关代码: Group.movementModel = ExternalMovement ExternalMovement.file = move...

qq_36974792的博客 659

Camunda 7.x 系列【22】全局监听器

Camunda支持义一个全局ExecutionListener和一个全局TaskListener,会捕获流程中发生的所有事件的通知,这样可以定义一个全局的审批人检查监听器,作用于所有用户任务。

记录知识、锤炼自我 2942

作物生长模型Oryza V3实战2:下载、安装与使用

摘要:ORYZA 现在的应用范围已从单一水稻作物模拟扩展到多个水稻作物模拟。我在csdn站内也上传了“作物生长模型oryza v3大全(含所有参数模板和4个校准程序1个分析工具)”,可以说是全网最全的吧。网上搜索一般下载的v3只有一个a3主程序,不适合作全面与深入的研究,本版本从国外下载回来,一开始少了一个“SoilHydrau.exe”文件,说是有病毒被隔离了,后经历各种技术手段,并向国际水道研究所发送邮件,才得以补全所有的参数化及校准程序、分析工具,来之不易,有缘人得之。

503

QCC51XX---人机接口设备协议( HID)

QCC51XX---人机接口设备协议( HID)

weixin_42162924的博客 819

14.建立时间、保持时间以及vivado时序report的参考使用

在设计数字系统时,需要仔细考虑电路元件的选择和布局以及时序设计来满足建立时间和保持时间的要求。建立时间,又称为建立时间窗口或建立期,是指数字信号在触发器的时钟信号前沿到来之前,必须已经稳定存在的时间。在本章节将结婚扫建立时间和保持时间的基本原理,以及如何通过vivado处理建立时间和保持时间。通过使用同步电路,可以更好地控制数据传输的时序并满足建立时间和保持时间的要求。例如,在D触发器中,选择具有适当充电和放电特性的D端口元件可以确保在时钟信号前沿到达前数据已经稳定存在,并在时钟信号前沿到达后保持稳定。

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 排序算法:冒泡排序(Bubble Sort)
下一篇: 题解-表达式括号匹配
Cancelleds
博客等级 码龄8年 1110粉丝 166原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值