图解流程

整体流程如下:


细节流程:
第一步:


第二步:


第三步:


第四步:


第五步:


第六步:


第七步:


第八步:


第九步:


第十步:

代码

public static void mergeSort(int[] arr) {if (arr == null || arr.length < 2) {return;}mergeSort(arr, 0, arr.length - 1);}public static void mergeSort(int[] arr, int L, int R) {if (L == R) {return;}int mid = (L + R) / 2;//将数组左侧全部排成有序mergeSort(arr, L, mid);//T(N/2)//将数组右侧全部排成有序mergeSort(arr, mid + 1, R);//T(N/2)merge(arr, L, mid, R);//O(N):因为N个数的话,需要依次扫过去}private static void merge(int[] arr, int L, int mid, int R) {//开辟一个临时数组,用来存放归并过程中的排好序的元素int[] help = new int[R - L + 1];//临时数组的索引int i = 0;int p1 = L;int p2 = mid + 1;while (p1 <= mid && p2 <= R) {if (arr[p1] <= arr[p2]) {help[i] = arr[p1];i++;p1++;} else {help[i] = arr[p2];i++;p2++;}}while (p1 <= mid) {help[i] = arr[p1];i++;p1++;}//上面的while循环和下面的while循环只会执行一个while (p2 <= R) {help[i] = arr[p2];i++;p2++;}for (int j = 0; j < help.length; j++) {// 这里要用arr[L+j]接受,因为每次进来归并排序的数组起始索引是L,长度是help的长度arr[L + j] = help[j];}}

Master公式

T(N) = a*T(N/b) + O(N^d)
1) 如果log(b,a) > d –> 复杂度为O(N^log(b,a))
2) 如果log(b,a) = d –> 复杂度为O(N^d * logN)
3) 如果log(b,a) < d –> 复杂度为O(N^d)

时间复杂度和额外空间复杂度

时间复杂度:

1、我们设mergeSort的时间复杂度为T(N)
2、从宏观上看,他分别调用了两次自己的函数mergeSort和一次merge,那么T(N)等于两次mergeSort的时间复杂度和一次merge的时间复杂度
3、调用自己的函数的时候,函数个数为N/2,则T(N)=2*T(N/2)+一次merge的时间复杂度
4、根据上面的流程分析merge总共扫描了N个数,执行了N次,所以时间复杂度为O(N)
5、所以T(N)=2*(N/2)+O(N)
6、根据Master公式,此时a=2,b=2,d=1,满足log(b,a) = d
7、所以归并排序时间复杂度为:O(N^d * logN)=O(N* logN)

额外空间复杂度:
因为我们每次执行merge的时候,都需要创建一个help数组,而这个help最大是N个数,需要N个空间,所以额外空间复杂度为O(N),稳定性排序

算法 归并排序的复杂度分析(含图解流程和Master公式)相关推荐

  1. 算法录 之 复杂度分析。

    一个算法的复杂度可以说也就是一个算法的效率,一般来说分为时间复杂度和空间复杂度... 注意接下来说的均是比较YY的,适用与ACM等不需严格分析只需要大致范围的地方,至于严格的算法复杂度分析的那些数学证 ...

  2. 常用排序算法 - 稳定性和复杂度分析

    一.前言 上一篇,只是简单的记录了常用算法的主要思想以及代码实现( 常用算法记录 ); 这次简单的记录一下算法的稳定性以及复杂度 二.稳定性 1. 稳定性的定义 如果两个相等的数据的先后位置,排序前后 ...

  3. 归并排序及其复杂度分析

    /* * (二分)归并排序(稳定算法) * 基本思想:将数组递归分成越来越小的数集,直到每个数集只有一个数 * 然后将数据递归排序,使其合并成与原来数据一样的有序序列 * 时间复杂度分析:递归分解数据 ...

  4. 两张图片计算相似度c语言算法,谱图相似度的计算方法与流程

    本发明涉及谱图,特别涉及谱图相似度的计算方法. 背景技术: 谱图的匹配比对在生物医学.化学.物理学等领域中有着广泛的应用. 在血液细菌感染(菌血症)的细菌鉴定工作中,由于患者的临床表现不典型,给感染的 ...

  5. 【排序综合】直接插入排序,希尔排序,快速排序,堆排序,冒泡排序,简单选择排序的简介,实现和算法复杂度分析

    目录 1. 直接插入排序 1.1 直接插入排序简介 1. 什么是直接插入排序 2. 排序思想 1.2 排序实现 1. 排序代码 2. 复杂度分析: 3. 运行结果: 1.3 学习链接 2. 希尔排序( ...

  6. 算法复杂度分析(3600字)

    文章目录 前言 一.复杂度分析的意义 二.复杂度分析基础 1. 大 O O O复杂度表示法 2. 时间复杂度分析方法 2.1 加法法则 2.2 乘法法则 3. 空间复杂度 总结 1. O ( 1 ) ...

  7. python jieba 文本相似度_文本相似度分析(基于jieba和gensim)

    ##基础概念 本文在进行文本相似度分析过程分为以下几个部分进行, 文本分词 语料库制作 算法训练 结果预测 分析过程主要用两个包来实现jieba,gensim jieba:主要实现分词过程 gensi ...

  8. 算法专题(1)-信息学基本解题流程!

    算法专题(1)-信息学基本解题流程! [文章来源:清北学堂微信订阅号noipnoi] 摘要 本次系列文章主要介绍信息学以下知识点 今天我们主要看信息学基本解题流程: 一. 基本解题流程 1.概述: 信 ...

  9. 算法笔记(一):复杂度分析:最好、最坏、平均、均摊

    数据结构指的是"一组数据的存储结构", 算法指的是"操作数据的一组方法". 数据结构是为算法服务的,算法是要作用再特定的数据结构上的. 效率和资源消耗的度量衡- ...

最新文章

  1. python tushare获取股票数据并可视化_荐Python获取股票数据及其可视化--基于tushare库...
  2. Java泛型总结---基本用法,类型限定,通配符,类型擦除
  3. 企业号开发php,微信企业号-开发笔记-1
  4. python numpy修改数据维度
  5. cygwin不支持__malloc_hook
  6. 如何使用 Mac 的通知中心?
  7. 使用eventfd唤醒阻塞在select、poll、epoll的IO复用
  8. steam加速_Apex英雄Steam版锁60帧 GoLink免费加速器助力畅快_综合资讯
  9. 如何删除mysql系统服务_如何彻底删除mysql服务(清理注册表)详解
  10. 【系统分析师之路】原创章节 重构与改善设计思维导图
  11. 单龙芯3A3000-7A1000PMON研究学习-(15)撸起袖子干-先来一杯代码吧
  12. 第一章 广告系统架构
  13. NYOJ-171 聪明的kk
  14. android 蓝牙地址连接打印机,android 连接蓝牙打印机 BluetoothAdapter
  15. 行为识别(CVPR2020南京大学腾讯) ~ TEA论文笔记 ~《TEA: Temporal Excitation and Aggregation for Action Recognition》
  16. sql server之T-SQL语句创建数据库创建表
  17. 正大国际期货:外盘黄金交易中如何用MACD指标捕捉波段
  18. python 实现maltab中离散正弦变换dst及其反变换idst
  19. oracle 误删 log文件,Redo log文件被删除恢复
  20. airplay 安卓接收_在没有Apple TV的情况下将AirPlay添加到接收器-Raspbmc和Raspberry Pi

热门文章

  1. 哲学家就餐问题(条件变量)
  2. 简单两招教会您,电脑怎么录屏
  3. 【成为历史以来最强的应届生】
  4. Ubuntu 安装Mysql数据库
  5. anaconda警告python未激活_Python位于conda env中,但尚未在Windows virtual en中激活
  6. 使用SQLyog远程连接MySQL
  7. c 语言 fun函数用法,Golang——函数func
  8. amber教程A17学习----概念篇
  9. 赶紧换回我以前比较老实的头像算了
  10. 高德地图使用——定位城市