【算法基础】归并排序

news2024/9/29 11:26:28

目录

一、归并排序的思想

二、归并排序的步骤

三、归并的方式

四、代码模板


一、归并排序的思想 

归并排序和快速排序一样,都是分治的思想。它是将一个无序的数组一分为二,最后再合二为一,将两个有序数组合并成为一个有序数组。

时间复杂度:O(nlogn)是稳定的排序

 二、归并排序的步骤

确定分界点。这个分界值通常是中间值  mid = (l + r) / 2

递归排序分界点左右两部分的区间。

归并。将两个有序序列合并成一个有序序列。【重点】

 三、归并的方式

【双指针算法】

大致过程如下(后附流程图):

第一步:使用2个指针 i = l ,j = mid + 1 分别指向分界点两端的数组头。

第二步:创建临时数组tmp来暂存排完有序的数组,用k来遍历tmp。

第三步:比较a[i] 和 a[j] 直至其中一个数组中的元素全部比完。分为两种情况:若a[i] \leq a[j] , 则tmp[k++] = a [i++] (将小的元素先放入tmp),同理,a[i] > a[j],则tmp[k++] = a[j++]

第三步:左右区间可能会有多余元素,则将多余元素原封不动放入数组tmp

第四步:最后再将tmp数组中的元素复制回原数组 a[ ]

【流程图】

四、代码模板

//定义全局变量临时数组
int tmp[10000000];
void merge_sort(int a[],int l,int r)
{
    if (l >= r) return; //一个数或没有数,没必要排序(递归出口) 
    //第一步:确定分界点
    int mid = (l + r) / 2;
    
    //第二步:递归排序分界点左右两部分的区间
    //递归左部分区间
    merge_sort(a,l,mid);
    //递归右部分区间
    merge_sort(a,mid + 1,r);
    
    //第三步:归并(双指针)
    int i = l,j = mid + 1;
    int k = 0;//遍历临时数组kmp
    while(i <= mid && j <= r)
    {
        if (a[i] <= a[j]) tmp[k++] = a[i++];
        else tmp[k++] = a[j++];
    }
    //如果左区间还有元素
    while (i <= mid) tmp[k++] = a[i++];
    //如果右区间还有元素
    while(j <= r) tmp[k++] = a[j++];
    
    //最后将tmp里的元素复制到原数组a[]
    for(int i = l,k = 0;i <= r;i++,k++) a[i] = tmp[k];
}

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

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

相关文章

2023兔年第一篇文章【CSS】之CSS列表详解【CSS基础知识详解】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【CSS】 【CSS专栏】已发布文章 &#x1f4c1;【CSS基础认知】 &#x1f4c1;【CSS选择器全解指南】 &#x1f4c1…

ARM S5PV210的iNand

一、iNand介绍 1、iNand/eMMC/SD Card/MMC Card 的关联 (1) 最早出现的是 MMC 卡&#xff0c;卡片式结构&#xff0c;按照 MMC 协议设计。&#xff08;相较于 NandFlash 芯片来说&#xff0c;MMC 卡有 2 个优势&#xff1a;第一是卡片化&#xff0c;便于拆装&#xff1b;第二是…

【Java开发】Spring Cloud 06 :分布式配置管理-Nacos Config

在微服务架构中&#xff0c;我们会使用一个分布式的“配置中心”来管理所有的配置文件和配置项&#xff0c;本章节将介绍 Nacos 配置中心的特性&#xff0c;以及这些特性在微服务体系中所发挥的作用。在 Spring Boot 应用中&#xff0c;我们习惯于使用传统的配置管理方式&#…

【蓝桥杯】简单数论——GCDLCM

GCD 最大公约数Greatest Common Divisor(GCD)&#xff1a;整数a和b的GCD是指能同时整除a和b的最大整数&#xff0c;记为gcd(a,b)。由于-a的因子和a的因子相同&#xff0c;因此gcd(a, b) gcd(al, |bl)。编码时只关注正整数的最大公约数。 GCD性质 (1) gcd(a, b) gcd(a, ab) g…

活动星投票教师创课大赛网络评选微信的投票方式线上免费投票

“教师创课大赛”网络评选投票_小程序不记名选举投票_投票微信创建链接_微信公众号投票制作小程序投票活动如何做&#xff1f;很多企业在运营当中&#xff0c;都会通过投票活动来进行推广&#xff0c;从而达到吸粉、增加用户粘度等效果。而此类投票活动&#xff0c;通过小程序就…

【C进阶】通讯录2.0(文末附原码)

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C语言进阶 ⭐代码仓库&#xff1a;C Advanced 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们…

webpack搭建的React脚手架项目与vite进行兼容化开发

React项目兼容vite开发 问题描述 前言&#xff1a;之前在做Vue开发项目的过程中&#xff0c;是使用vite搭建的项目&#xff0c;不论是启动速度还是热更新&#xff0c;都非常的丝滑&#xff0c;可以极大弥补我电脑的短板&#xff0c;也提升了我的开发体验&#xff01;。 由于…

马帮对接打通金蝶云星空订单

马帮对接打通金蝶云星空获取订单列表接口与销售出库新增接口接入系统&#xff1a;马帮马帮ERP旗下有马帮ERP3.0、马帮ERP亚马逊专用版、马帮WMS仓储管理系统、马帮云仓、马帮TMS、跨境分销、马帮供应链SCM管理系统等产品&#xff0c;为跨境电商卖家提供高效管理方法和解决方案&…

【操作系统】—— 如何使用VMware虚拟机(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

java多态/类的组合2022023

多态 Java引用变量有两个类型&#xff1a;一个是编译时类型&#xff0c;一个是运行时类型。编译时类型由声明该变量时使用的类型决定&#xff0c;运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致&#xff0c;就可能出现所谓的多态&#xff08;Polymor…

LeetCode刷题复盘笔记—一文搞懂贪心算法之55. 跳跃游戏问题(贪心算法系列第四篇)

今日主要总结一下可以使用贪心算法解决的一道题目&#xff0c;55. 跳跃游戏 题目&#xff1a;55. 跳跃游戏 Leetcode题目地址 题目描述&#xff1a; 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长…

Python流程控制语句之选择语句

前言 在生活中&#xff0c;我们总是要做出许多选择&#xff0c;程序也是一样。比如下面的例子&#xff1a; 如果输入的用户名和密码正确&#xff0c;提示登录成功&#xff0c;否则&#xff0c;提示登录失败。如果考试成绩大于等于60分&#xff0c;则及格&#xff0c;否则不及…

在甲骨文云容器实例(Container Instances)上部署firefox

甲骨文云推出了容器实例&#xff0c;这是一项无服务器计算服务&#xff0c;可以即时运行容器&#xff0c;而无需管理任何服务器。 今天我们尝试一下通过容器实例部署firefox。 Step1. 创建容器实例 在甲骨文容器实例页面&#xff0c;单击"创建容器实例"&#xff0c…

[漏洞分析] CVE-2022-2602 io_uring UAF内核提权详细解析

本文首发于华为安全应急响应中心公众号&#xff1a; https://mp.weixin.qq.com/s/w_u0FoiFdU0KM397UXJojw 文章目录漏洞简介环境搭建漏洞原理文件引用计数与飞行计数引用计数飞行计数发送过程scm_send接收过程unix_gc垃圾处理机制io_uring原理(仅限漏洞)io_uring_setupio_urin…

零基础学JavaWeb开发(十六)之 mybatis(2)

5、MyBatis - 映射文件标签 5.1、映射文件的顶级元素 select&#xff1a;映射查询语句 insert&#xff1a;映射插入语句 update&#xff1a;映射更新语句 delete&#xff1a;映射删除语句 sql&#xff1a;可以重用的 sql 代码块 resultMap&#xff1a;最复杂&#xff0c…

11. 集合set类型详解

python3 set类型的使用 1. 基础知识 &#xff08;1&#xff09; 集合&#xff08;set&#xff09;是由一个或数个形态各异的大小整体组成的&#xff0c;构成集合的事物或对象称作元素或是成员。集合是一个无序的不重复元素序列。 &#xff08;2&#xff09;基本功能是进行成员…

大年初四,Flutter Forward 中国社区直播活动与你不见不散

之前我们预告过&#xff0c;2023 年 1 月 25 日 (年初四)&#xff0c;Flutter 团队将在肯尼亚首都内罗毕举办 Flutter Forward 大会&#xff0c;并同时开启线上直播。本次活动将为展示最新的 Flutter 技术更新&#xff0c;包括一个主题演讲&#xff0c;以及多个技术演讲和线上问…

【兔年之兔子走迷宫】 用一个小游戏对回溯法进行实现 | C++

第六章 回溯法 目录 第六章 回溯法 ●前言 ●一、回溯法是什么&#xff1f; 1.简要介绍 ●二、回溯法经典案例——兔子走迷宫游戏 1.具体情况 2.代码展示&#xff08;C&#xff09; 3.结果展示 ●总结 前言 简单的来说&#xff0c;算法就是用计算机程序代码来实…

性能监控和工具使用

1、jvm 内存模型 程序计数器 Program Counter Register&#xff1a;  记录的是正在执行的虚拟机字节码指令的地址&#xff0c;  此内存区域是唯一一个在JAVA虚拟机规范中没有规定任何OutOfMemoryError的区 域  虚拟机&#xff1a;VM Stack  描述的是 JAVA 方法执行的内…

Delphi 中.dproj 文件解析(二、详细解析)

上一篇 介绍了Delphi 的各个版本&#xff0c;本文开始分析.dproj文件。.dproj是一个XML文件&#xff0c;里边包含了我们在Delphi开发环境中对项目设置的所有参数&#xff08;位于IDE&#xff1a;Project -> Options 中&#xff09;&#xff0c;包括并不限于&#xff1a;版本…