众所周知,归并排序的时间复杂度是O(N*lgN)

归并排序的时间复杂度推导书上网上一抓一把,但是多数证明都是基于N=2k这个假设来证明的,下面我给出一般情况的证明。

先上归并排序代码:

public class MergeSort implements Sort {private static int count = 0;@Overridepublic int[] sort(int[] data) {return sort(data, 0, data.length - 1);}private int[] sort(int[] data, int low, int high) {if (low == high) {return new int[] { data[low] };}int mid = (low + high) >> 1;int[] left = sort(data, low, mid); //(1)int[] right = sort(data, mid + 1, high); //(2)int[] result = new int[high - low + 1];int i = 0, k = 0;//(3) for (int j = 0; j < result.length; j++) {count++;if (i == left.length) {result[j] = right[k++];} else if (k == right.length) {result[j] = left[i++];} else {if (left[i] <= right[k]) {result[j] = left[i++];} else {result[j] = right[k++];}}}return result;}}

根据代码可以看出,时间消耗主要在我标红的3个地方,可以得出:

我们知道每一个整数都可以表示为2i+k的形式,如1=20+0,5=22+1,10=23+2,因此

设N=2i+k

令n=i+1,则有:

根据我们对i和k的定义,k<2i(不然如果k>=2i那么i就应该能取到i+1了)。

因此有:

所以有:

回到开头的公式:

所以:

据此可以得出归并排序的时间复杂度是O(N*lgN)。

转载于:https://www.cnblogs.com/sheeva/p/6600666.html

归并排序时间复杂度推导相关推荐

  1. 快速排序,冒泡排序时间复杂度推导

    快速排序,冒泡排序时间复杂度推导 快速排序时间复杂度分析: 数组长度为n 1,平均复杂度: t(n) = cn + 2t(n/2) = cn + 2(cn/2 + 2t(n/4)) = 2cn + 4 ...

  2. K分查找时间复杂度推导

    K分查找时间复杂度推导 问题描述 类比二分搜索算法,设计k分搜索算法(k为大于2的整数)如下:首先检查n/k处(n为被搜索集合的元素个数)的元素是否等于要搜索的值,然后检查2n/k处的元素,--,这样 ...

  3. 快速排序归并排序—时间复杂度分析

    引言: 大家好,我是小星星,今天要梳理的知识点是--快速排序和归并排序时间复杂度分析. 目录 一.快排时间复杂度分析 二.归并排序时间复杂度分析 三.写在最后 一.快排时间复杂度分析 快速排序的时间复 ...

  4. 归并排序时间复杂度----主定理

    http://blog.csdn.net/touch_2011/article/details/6785881 1.序言 这是<漫谈经典排序算法系列>第四篇,解析了归并排序. 各种排序算法 ...

  5. 分治法的计算时间、时间复杂度推导以及经典算法分析

    分治是一种解决复杂问题的思想,它可以将一个问题划分成多个小的问题,通过合并这些问题求得原问题的解.本文对分治法进行复杂性分析,并通过这种方法分析几个具体算法的时间复杂度. 文章目录 1 分治法的复杂性 ...

  6. 算法笔记-归并排序、归并排序时间复杂度、例题

    1. 归并排序 1)整体就是一个简单递归,左边排好序.右边排好序.让其整体有序 2)让其整体有序的过程里用了外排序方法 3)利用master公式来求解时间复杂度 4)归并排序的实质,实质是减少了元素间 ...

  7. 归并排序时间复杂度_一文带你读懂排序算法(四):归并算法

    点击上方蓝字关注我们 归并排序的基本思想核心是分治,就是把一个复杂的问题分成两个或多个相同或相似的子问题,然后把子问题分成更小的子问题,直到子问题可以简单的直接求解,最原问题的解就是子问题解的合并.算 ...

  8. Day_12,归并排序时间复杂度计算

    归并排序详细代码及思路可见我之前的文章归并排序 今天讲讲,为什么归并排序的时间复杂度是θ(nlgn) 我们知道归并排序是利用 递归函数 进行计算的一种分治排序算法,因此对其时间复杂度也可以用递归的方式 ...

  9. 关于归并排序时间复杂度 T(n) =2T(n/2)+O(n)

    T(n)=2T(n/2)+O(n),n=2^k. 想知道为什么最终答案为O(nlgn) Master大法好.这题自己推导也不难.把递推公式重复代入三次并化简: 可以看出规律了,而且很容易用归纳法证明. ...

最新文章

  1. 检测到包降级: Microsoft.Extensions.Configuration.Abstractions 从 2.1.1 降 2.1.0
  2. editor修改样式 vue_vue+element-ui项目搭建实战
  3. linux只有上传文件到站点,史上最简单的上传文件到linux系统方法
  4. 004-2-拟合,drop-out
  5. Endnote技巧:解决中英参考文献混排问题,附国标文件
  6. [css] 在页面中的应该使用奇数还是偶数的字体?为什么呢?
  7. 计算机进位法,计算机基础知识--进位计数制.docx
  8. Java并发编程 - 显示锁Lock和ReentrantLock
  9. python codefirst_Python code.co_consts方法代码示例
  10. ❤️力扣线性枚举算法第二题数组中连续为一的最大个数
  11. php 防止access token过期,微信調用接口,防止Access_token過期的方法
  12. jquery的DOM节点操作(创建和插入元素节点)
  13. L1-022 奇偶分家 (10 分) — 团体程序设计天梯赛
  14. 查看oracle数据库是否归档和修改归档模式(转)
  15. 华为交换机如何导出配置信息_华为交换机配置命令 华为QuidWay交换机配置命令手册...
  16. 高中计算机平面设计计划书,日照师范学校计算机平面设计专业教学方案.doc
  17. SpringCloud系列之服务总线(Bus)
  18. CTFHub技能树——备份文件下载
  19. 手把手教你做小米商城-商品展示页面
  20. Linux 小程序开发日记(终章)(pyqt+yolov5)

热门文章

  1. 验证:使用node 12.18.4版本安装vue cli4没有问题(先卸载vue cli2再安装)
  2. 【代码】使用reentrantlock必须要手动释放锁
  3. 【视频】vue指令v-on绑定事件
  4. seata分布式事务框架原理
  5. Lucene查询索引代码实现
  6. Nginx实现高可用的工作原理
  7. ubuntu linux本地源,搭建Ubuntu 12.04 本地源
  8. Quartz分布式实现
  9. C语言中结构体的初始化
  10. dfmea文件_DFMEA和PFMEA的“六步法”其实很不一样