一文读懂『归并排序』算法(Merge Sort)(含算法模板)

8 篇文章 2 订阅
订阅专栏
6 篇文章 0 订阅
订阅专栏

一、归并排序算法(Merge Sort)简介

归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用 分治法(Divide and Conquer) 的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

与上一讲 【Y总/算法基础课/学习笔记】快速排序(Quick Sort)(含算法模板)相比,快速排序是将序列想划分成两个子序列,再递归使子序列有序;而归并排序是先使子序列有序,再进行合并。


二、 算法基本思想和流程(时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

在这里插入图片描述

  • Step1——确定分界点mid(三种常用的方法):q[l]q[(l+r)/2]q[r],或者随机确定;
  • Step2——将待排序列调整成 leftright 两个子序列,递归排序 leftright
  • Step3——归并(合二为一),Finish!

2. 难点/关键点:步骤三的归并方法(双指针算法, O ( n ) O(n) O(n)

步骤二结束后会得到两个排好序的子序列 list1list2 ,采用 双指针算法 将其合二为一:

  • 定义两个指针:ij,分别指向两个子序列的起始元素,另外定义一个新序列 temp 用来存储归并结果;
  • 两指针指向的元素进行比较:
    • *i <= *j ,将该元素放入到 temp 中,并且 i++
    • *i > *j ,将该元素放入到 temp 中,并且 j++
  • 不断循环进行上述比较操作,直到某一个指针指向了该子序列的末尾,则将另一个序列的剩余部分全部按顺序放入 temp 中即可,所得的 temp 序列为归并排序的结果。

举个例子如下,易于理解:
在这里插入图片描述

在这里插入图片描述


三、 归并排序模板(背诵)

模板题: AcWing 787. 归并排序

注意:此题数据较大且多,输入输出建议使用 scanfprintf ,要使用C++的 cincout 需要进行速度优化,参考另一篇博文: C++ 输入输出(cin & cout)加速/效率优化 。

模板一:

void merge_sort(int q[], int l, int r)
{
	// 1.判边界
    if (l >= r) return;
	
	// 2.定分界点
    int mid = l + r >> 1;
	// 递归排序子序列
    merge_sort(q, l, mid), merge_sort(q, mid + 1, r);

	// 3.归并排序(双指针法)
    int k = 0, i = l, j = mid + 1;
    while (i <= mid && j <= r)
        if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
        else tmp[k ++ ] = q[j ++ ];
    // 某个子序列走到最后了,将另一个序列剩余部分加入到 tmp 中
    while (i <= mid) tmp[k ++ ] = q[i ++ ];
    while (j <= r) tmp[k ++ ] = q[j ++ ];
	
	// 将排序结果 tmp 重新覆盖掉 q
    for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}

模板二:

void merge_sort(int q[], int l, int r)
{
	// 1.判边界
    if (l >= r) return;
	
	// 2.定分界点
    int mid = l + r + 1 >> 1;
	// 递归排序子序列
    merge_sort(q, l, mid - 1), merge_sort(q, mid, r);

	// 3.归并排序(双指针法)
    int k = 0, i = l, j = mid;
    while (i <= mid - 1 && j <= r)
        if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
        else tmp[k ++ ] = q[j ++ ];
    // 某个子序列走到最后了,将另一个序列剩余部分加入到 tmp 中
    while (i <= mid - 1) tmp[k ++ ] = q[i ++ ];
    while (j <= r) tmp[k ++ ] = q[j ++ ];
	
	// 将排序结果 tmp 重新覆盖掉 q
    for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}

【分析避免边界问题】

  • 当递归取的 merge_sort(q, l, mid), merge_sort(q, mid + 1, r);,则为了避免陷入死循环,取中间值需要下取整 x = q[l + r >> 1]
  • 当递归取的 merge_sort(q, l, mid - 1), merge_sort(q, mid, r);,则为了避免陷入死循环,取中间值需要上取整 x = q[l + r + 1 >> 1]
排序-归并排序Merge sort
12-22
排序——归并排序Merge sort
C++实现归并排序算法
12-20
归并 归并排序MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 算法描述 归并操作的工作原理如下: 1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 2、设定两个指针,最初位置分别为两个已经排序序列的起始位置 3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 4、重复步骤3直到某一指针超出序列尾 5、将另一序列剩下
一文读懂归并排序算法Merge Sort
专注自动化、性能测试、测试架构学习交流
03-13 677
归并排序Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用 分治法(Divide and Conquer) 的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
数据结构排序算法——归并排序
05-29 1809
归并排序算法简介
合并排序算法——merge sort
04-05
#include <stdio.h> #include <malloc.h> #include <limits.h> void init(int A[],int p,int r);//初始化数组 void print_A(int A[],int p,int r);//打印数组元素 void merge(int A[],int p,int q,int r);//合并排序算法 /************合并排序算法的实现******************/ int main() { int p,q,r; printf("合并排序算法的实现:\n"); printf("请输入p、q、r的值(输入格式1,12,13):"); scanf("%d,%d,%d",&p,&q,&r); printf("p=%d,q=%d,r=%d\n",p,q,r); int * A = (int*)malloc((r+1)*sizeof(int)); init(A,p,r); printf("待合并数组:\n"); print_A(A,p,r); printf("\n\n"); printf("合并排序算法的实现过程:\n"); merge(A,p,q,r); free(A);//释放动态数组空间 return 0; }
归并排序Merge sort算法
Yuwen's Hero
07-15 2078
Merge sort 算法的思想就是把数组分成更小的数组,合并的时候再排序。由于是二分,所以总的时间为 T(n) = 2 T(n/2) + \theta (n) = O(n * lgn)。 public void mergeSort(int[] array, int start, int end) { if (start < end) { int mid = start + (end
归并排序算法
qq_44111805的博客
01-31 752
一、归并排序算法基本思想 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法,将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 二、归并排序图解 三、代码实现 package Sort; import java.util.Arrays; public class MergeSort { public static void mergesort(int[] arr,int left,int right,
归并排序(merge sort)算法实现
weixin_33882452的博客
05-14 87
 归并排序(merge sort)体现了分治的思想,即将一个待排序数组分为两部分,对这两个部分进行归并排序,排序后,再对两个已经排序好的数组进行合并。这种思想可以用递归方式很容易实现。归并排序的时间复杂度为O(nlogn),空间复杂度为O(n)。实现代码如下:#include &lt;stdio.h&gt; #include "common.h"  void merge(int data[], i...
归并排序算法merge sort
m0_58783923的博客
07-22 1020
前言: 归并算法,是10大经典算法之一,后续会更新其他的算法,本博客的全部代码以及图片实例都来里于b站,排序算法归并排序【图解+代码】_哔哩哔哩_bilibili,但是本人已经理解了代码的所有内容,下面是我根据up主的视频自己的思考过程。我也看了其他人的代码,但是感觉这个up主的代码更能锻炼我最近所学的东西,由于时间复杂度和空间复杂度还没有深入接触,本文暂时先不写,后续会更新。 1:全部代码 #include<stdio.h> #include<stdlib.h> void
python基本算法之实现归并排序(Merge sort)
12-17
冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neumann于1945年发明。采用分治法(Divide and Conquer)的经典应用!!将规模较大的排序问题化归到较小的规模上解决。 基本实现...
C#,归并排序算法Merge Sort Algorithm)的源代码及数据可视化
03-21
归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。...
归并排序Merge Sort).md
07-18
在B站讲归并排序的笔记,需要的同学可以免费下载
C#,单向链表(Simply Linked List)的归并排序Merge Sort算法与源代码
03-24
C#,单向链表(Simply Linked List)的归并排序Merge Sort算法与源代码 归并排序法(3Merge Sort,以下简称MS)是分治法思想运用的一个典范。 其主要算法操作可以分为以下步骤: Step 1:将n个元素分成两个n/...
Java实现归并排序算法(源代码)
最新发布
05-07
归并排序是一种基于分治策略的排序算法,它将待排序的数组分成若干个子数组,每个子数组再递归地进行排序,最后将已排序的子数组合并成一个完整的有序数组。该算法的核心在于合并两个有序数组的操作,通过比较两个...
C#,双向链表(Doubly Linked List)归并排序Merge Sort算法与源代码
03-24
C#,双向链表(Doubly Linked List)归并排序Merge Sort算法与源代码 1 双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一...
归并排序算法Merge Sort)的Java实现
02-24
归并算法的简单举例
merge sort
马金波
06-15 1184
code #include <stdio.h> void merge(int a[], int t[], int l, int m, int r); void merge_sort(int a[], int t[], int l, int r); void print_array(int a[], int l, int r); void merge(int a[], int t[]...
算法导论》——MergeSort
weixin_30686845的博客
07-16 129
前言:   在今后的日子里,我将持续更新博客,讨论《算法导论》一书中的提到的各算法的C++实现。初来乍到,请多指教。 今日主题:     今天讨论《算法导论》第二章算法基础中的归并排序算法。下面是该算法的代码Merge.h:    #include <stdlib.h> namespace dksl { /* * 归并 * numArray为整形数组 ...
二分归并排序算法_排序算法归并排序
05-24
归并排序Merge Sort)是一种稳定的、基于比较的排序算法,最坏时间复杂度为 O(nlogn)。其基本思想是将待排序序列分成若干个子序列,每个子序列都是有序的,然后将子序列合并成整体有序的序列。 归并排序的实现...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • [2023-01 持续更新] 谷歌google镜像/Sci-Hub可用网址/Github镜像可用网址总结 285330
  • Zotero 超好用插件的下载链接及配置方法(PDF-translate/ZotFile/茉莉花/Zotero Scihub) 145559
  • Sublime Text 4 解决 python 代码自动补全问题 7262
  • C++ 输入输出(cin & cout)加速/效率优化 6811
  • 【后续还会补充】Sublime Text 4 常用插件安装及配置方法 6794

分类专栏

  • 算法 8篇
  • 基础算法 6篇
  • 数学知识
  • 数据结构 1篇
  • 专题训练 1篇
  • Git 详细教程 6篇
  • LeetCode刷题笔记 13篇
  • LeetCode 周赛与双周赛题解

最新评论

  • Zotero 超好用插件的下载链接及配置方法(PDF-translate/ZotFile/茉莉花/Zotero Scihub)

    PanyCG_pc: 可以在github上查看一下可兼容的版本哦

  • Zotero 超好用插件的下载链接及配置方法(PDF-translate/ZotFile/茉莉花/Zotero Scihub)

    m0_74529834: 想问问楼主 安装了pdf translate, 但是在添加组件的时候显示不兼容怎么办呢,谢谢楼主

  • Zotero 超好用插件的下载链接及配置方法(PDF-translate/ZotFile/茉莉花/Zotero Scihub)

    m0_71014426: github上没有下载到xpi文件啊

  • CentOS 更换阿里源解决 yum/wget 下载慢的问题

    2201_75643695: 为什么我生成新缓存的时候还是很慢

  • Zotero 超好用插件的下载链接及配置方法(PDF-translate/ZotFile/茉莉花/Zotero Scihub)

    ksjkdjd: 请问下载完,不能用没反应是为啥呀表情包

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • CentOS 7 下载安装 Java JDK 17
  • CentOS 7 升级 cmke 版本
  • CentOS 7 升级安装 Python 3.9 版本
2023年6篇
2022年35篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

PanyCG_pc

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

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

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

打赏作者

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

抵扣说明:

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

余额充值

深圳SEO优化公司舟山网站改版推荐长春网站推广哪家好玉溪阿里店铺托管多少钱陇南企业网站建设公司新乡设计公司网站多少钱迁安网络营销白山阿里店铺托管哪家好雅安seo网站推广报价长葛建网站价格昆明网站seo优化哪家好铜川SEO按天计费多少钱南京SEO按天扣费价格阿坝seo优化报价盐田模板推广哪家好遵义关键词按天扣费哪家好垦利企业网站建设公司秦皇岛seo排名哪家好太原seo网站推广公司南联网站设计哪家好忻州建设网站多少钱秦皇岛网站推广方案推荐衡阳百姓网标王推广伊春至尊标王哪家好深圳网络营销杭州模板网站建设衢州SEO按效果付费哪家好盐城企业网站制作报价清徐百度网站优化哪家好盐田网站制作设计广元网站开发歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化