【算法学习】归并算法Merge Sort总结

news2024/11/20 4:41:52

归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

1. 基本思想

归并排序使用分治思想,分治模式下每一层递归有三个步骤:

  • 分解(divide):将n个元素分成两个含n/2个元素的子序列
  • 解决(conquer):用合并排序法对两个子序列递归的排序
  • 合并(combine):直接合并两个已排序好的子序列

在这里插入图片描述
解释:上图中首先把一个未排序的序列从中间分割成2部分,再把2部分分成4部分,依次分割下去,直到分割成一个一个的数据,再把这些数据两两归并到一起,使之有序,不停的归并,最后成为一个排好序的序列。

2. 时间复杂度

归并排序中最主要的操作就是将两个有序序列合并,该操作的算法复杂度对归并排序的算法复杂度影响最大。
在这里插入图片描述

算得,时间复杂度为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)

3. 算法实现

它的思路是先将数组分成两个子数组,然后分别对两个子数组进行归并排序,最后将两个有序的子数组合并成一个有序的数组。在合并的过程中,使用一个临时数组reg来存储合并后的结果,最后再将结果复制回原数组arr中。

#define N 100
int arr[N],reg[N];
void merge_sort(int l,int r){
    if(l>=r) return;
    int mid=(l+r)/2;
    int i=l,j=mid+1; //两个指针,分别指向分治后的两个子数列
    int k=l; //用于更新临时数组reg内的值
    //分治
    merge_sort(l,mid);
    merge_sort(mid+1,r);
    //合并
    while(i<=mid && j<=r){
        if(arr[i]<=arr[j]) reg[k++]=arr[i++];
        else reg[k++]=arr[j++] ;
    }
    while(i<=mid) reg[k++]=arr[i++];
    while(j<=r) reg[k++]=arr[j++];
    for(int k=l;k<=r;k++)
        arr[k]=reg[k];

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1112179.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1813_ChibiOS的RT系统层

全部学习汇总&#xff1a; GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 在ChibiOS中有一个RT系统层的部分&#xff0c;也就是内核的系统层。这个在其他的OS中是没有看到的&#xff0c;这里针对这一部分做一个简单的认识。…

送水订水商城小程序的作用是什么

无论瓶装水还是桶装水在市场中的需求度总是很高&#xff0c;相关送水公司或零售水企业也不少&#xff0c;消费者的购物方式一般是品牌直售或通过经销商&#xff0c;零售水则是超市/商场等场景。随着人们健康品质生活提升&#xff0c;家庭或办公等场所对桶装水或瓶装水的需求日益…

启山智软商城源码新官网震撼上线

欢迎来到我们全新升级的启山智软官网&#xff01; 启山智软一直致力于提供最优质的产品和服务&#xff0c;不断为客户创造更多价值。为了更好地展示我们的品牌形象和产品特色&#xff0c;我们进行了全新的网站升级。新官网拥有更加美观、简洁、直观的界面设计&#xff0c;更加智…

洗地机哪个品牌最好最实用?口碑最好的洗地机

当代人的家庭清洁方式&#xff0c;都悄摸摸的用上了智能扫地机或者洗地机&#xff0c;但是扫地机机器人对于一些顽固污渍的清洁能力略差&#xff0c;人不在家里的时候总担心会碰到啥东西卡机&#xff0c;所以&#xff0c;洗地机更适合对于清洁有高要求的人群&#xff0c;毕竟自…

开发过程中的八种确认方法

确认是确保做了正确的事情&#xff0c;方向不偏。确认可以在项目前期做&#xff0c;也可以在项目后期做&#xff0c;提倡持续确认、质量左移。在前期主要是检测需求的质量&#xff0c;在后期是检测完成的系统是否真的是客户所需。开发过程中常见的八种确认手段有&#xff1a; 1…

【APUE】进程

目录 一、进程标识符 pid 1.1 类型 pid_t 1.2 命令 ps 1.3 getpid && getppid 二、进程的产生 2.1 fork 简介 2.2 fork 实例 1 2.3 fork 实例 2 2.4 vfork 三、进程的消亡及释放资源 3.1 wait 3.2 waitpid 3.3 应用&#xff1a;进程分配初探 四、exec…

基于SSM的疫情期间高校师生外出请假管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

十八、字符串(1)

本章概要 字符串的不可变 的重载与 StringBuilder 意外递归字符串操作 字符串操作毫无疑问是计算机程序设计中最常见的行为之一。 在 Java 大展拳脚的 Web 系统中更是如此。在本章中&#xff0c;我们将深入学习在 Java 语言中应用最广泛的 String 类&#xff0c;并研究与之相关…

功率放大器在材料测试中的应用有哪些

功率放大器在材料测试中有广泛的应用&#xff0c;尤其在材料的物理、电子和热学性质等方面的研究中起到了重要的作用。下面Aigtek安泰将详细介绍功率放大器在材料测试中的一些主要应用。 电学特性测试&#xff1a;功率放大器用于材料的电学特性测试&#xff0c;如电导率、介电常…

划词搜索IP插件

插件背景 浏览器插件可以让用户根据个人工作及日常需求来定制浏览器的功能和界面。当用户在网页上看到一些IP地址时&#xff0c;或许会好奇它们的来源和归属。传统的做法是&#xff0c;用户需要复制这个IP地址&#xff0c;然后跳转到埃文科技旗下的http://IPUU.net网站进行查询…

分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于BiLSTM-…

MMoE: 基于多门专家混合的多任务学习任务关系建模

文章链接&#xff1a;Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts 发表会议: KKD 2018 &#xff08;Knowledge Discovery and Data Mining&#xff0c;数据挖掘领域顶会&#xff09; 目录 1.背景介绍Recommendation SystemMulti-…

wps excel js编程

定义全局变量 const a "dota" function test() {Debug.Print(a) }获取表格中单元格内容 function test() {Debug.Print("第一行第二列",Cells(1,2).Text)Debug.Print("A1:",Range("A1").Text) }写单元格 Range("C1").Val…

【UE】两步实现“从UI中拖出Actor放置到场景中”

效果 步骤 1. 创建两个actor蓝图 在两个蓝图中分别添加立方体和球体形状的静态网格体组件&#xff0c;注意移动性设置为“可移动” 设置碰撞预设为“NoCollsion” 2. 先创建一个控件蓝图 打开控件蓝图&#xff0c;在画布面板中添加两个按钮 为按钮添加“按压时”和“松开时”的…

手工测试的迷茫:除了重复劳动,到底还有什么?

我是在2008年毕业的&#xff0c;三本的学校&#xff0c;不上不下的专业水平&#xff0c;毕业的时候&#xff0c;恰好遇到了金融危机。校园招聘里阴差阳错的巧合&#xff0c;让我走上了软件测试工程师的道路。 入职第一天&#xff0c;来了个高大上的讲师&#xff0c;记得他是这…

easyphoto 妙鸭相机

AIGC专栏7——EasyPhoto 人像训练与生成原理详解-CSDN博客如何训练一个高品质的人像Lora与应用高品质Lora的链路对于写真生成而言非常重要。由《LoRA: Low-Rank Adaptation of Large Language Models》 提出的一种基于低秩矩阵的对大参数模型进行少量参数微调训练的方法&#x…

【牛客网】HJ91.走方格的方案数

题目 思路 考虑特殊情况,假设行数为m1,列数为n 则最短路径为mn 假设行数为m,列数n1,则最短路径为mn 考虑普遍情况 假设行数为m,列数为n 则总路经数为行数为m-1列数为n和行数为m列数为n-1的两个的和 根据上述条件,可以考虑使用递归的方式进行解决 代码 import java.util.Scan…

springmvc视图格式——模板引擎freemarker输出HTML文本

目录 1. freemarker 介绍创建测试工程2.2.2) 配置文件2.2.3) 创建模型类2.2.4) 创建模板2.2.5) 创建controller2.2.6) 创建启动类2.2.7) 测试 2.3) freemarker基础2.3.1) 基础语法种类2.3.2) 集合指令&#xff08;List和Map&#xff09;2.3.3) if指令2.3.4) 运算符2.3.5) 空值处…

Java设计模式 | 基于订单批量支付场景,对策略模式和简单工厂模式进行简单实现

基于订单批量支付场景&#xff0c;对策略模式和简单工厂模式进行简单实现 文章目录 策略模式介绍实现抽象策略具体策略1.AliPayStrategy2.WeChatPayStrategy 环境 使用简单工厂来获取具体策略对象支付方式枚举策略工厂接口策略工厂实现 测试使用订单实体类对订单进行批量支付结…

VS code中使用code Runner插件直接运行Typescript

使用VS code运行ts 运行问题 我们知道&#xff0c;在VS code中运行.ts文件&#xff0c;是不能直接运行的&#xff0c;需要在修改代码之后&#xff0c;都重复执行两个命令&#xff0c;才能运行ts代码 tsc 文件名.ts &#xff08;tsc 文件名.ts -w 可以监视ts文件(监视模…