归并排序时间复杂度推导
众所周知,归并排序的时间复杂度是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
归并排序时间复杂度推导相关推荐
- 快速排序,冒泡排序时间复杂度推导
快速排序,冒泡排序时间复杂度推导 快速排序时间复杂度分析: 数组长度为n 1,平均复杂度: t(n) = cn + 2t(n/2) = cn + 2(cn/2 + 2t(n/4)) = 2cn + 4 ...
- K分查找时间复杂度推导
K分查找时间复杂度推导 问题描述 类比二分搜索算法,设计k分搜索算法(k为大于2的整数)如下:首先检查n/k处(n为被搜索集合的元素个数)的元素是否等于要搜索的值,然后检查2n/k处的元素,--,这样 ...
- 快速排序归并排序—时间复杂度分析
引言: 大家好,我是小星星,今天要梳理的知识点是--快速排序和归并排序时间复杂度分析. 目录 一.快排时间复杂度分析 二.归并排序时间复杂度分析 三.写在最后 一.快排时间复杂度分析 快速排序的时间复 ...
- 归并排序时间复杂度----主定理
http://blog.csdn.net/touch_2011/article/details/6785881 1.序言 这是<漫谈经典排序算法系列>第四篇,解析了归并排序. 各种排序算法 ...
- 分治法的计算时间、时间复杂度推导以及经典算法分析
分治是一种解决复杂问题的思想,它可以将一个问题划分成多个小的问题,通过合并这些问题求得原问题的解.本文对分治法进行复杂性分析,并通过这种方法分析几个具体算法的时间复杂度. 文章目录 1 分治法的复杂性 ...
- 算法笔记-归并排序、归并排序时间复杂度、例题
1. 归并排序 1)整体就是一个简单递归,左边排好序.右边排好序.让其整体有序 2)让其整体有序的过程里用了外排序方法 3)利用master公式来求解时间复杂度 4)归并排序的实质,实质是减少了元素间 ...
- 归并排序时间复杂度_一文带你读懂排序算法(四):归并算法
点击上方蓝字关注我们 归并排序的基本思想核心是分治,就是把一个复杂的问题分成两个或多个相同或相似的子问题,然后把子问题分成更小的子问题,直到子问题可以简单的直接求解,最原问题的解就是子问题解的合并.算 ...
- Day_12,归并排序时间复杂度计算
归并排序详细代码及思路可见我之前的文章归并排序 今天讲讲,为什么归并排序的时间复杂度是θ(nlgn) 我们知道归并排序是利用 递归函数 进行计算的一种分治排序算法,因此对其时间复杂度也可以用递归的方式 ...
- 关于归并排序时间复杂度 T(n) =2T(n/2)+O(n)
T(n)=2T(n/2)+O(n),n=2^k. 想知道为什么最终答案为O(nlgn) Master大法好.这题自己推导也不难.把递推公式重复代入三次并化简: 可以看出规律了,而且很容易用归纳法证明. ...
最新文章
- 检测到包降级: Microsoft.Extensions.Configuration.Abstractions 从 2.1.1 降 2.1.0
- editor修改样式 vue_vue+element-ui项目搭建实战
- linux只有上传文件到站点,史上最简单的上传文件到linux系统方法
- 004-2-拟合,drop-out
- Endnote技巧:解决中英参考文献混排问题,附国标文件
- [css] 在页面中的应该使用奇数还是偶数的字体?为什么呢?
- 计算机进位法,计算机基础知识--进位计数制.docx
- Java并发编程 - 显示锁Lock和ReentrantLock
- python codefirst_Python code.co_consts方法代码示例
- ❤️力扣线性枚举算法第二题数组中连续为一的最大个数
- php 防止access token过期,微信調用接口,防止Access_token過期的方法
- jquery的DOM节点操作(创建和插入元素节点)
- L1-022 奇偶分家 (10 分) — 团体程序设计天梯赛
- 查看oracle数据库是否归档和修改归档模式(转)
- 华为交换机如何导出配置信息_华为交换机配置命令 华为QuidWay交换机配置命令手册...
- 高中计算机平面设计计划书,日照师范学校计算机平面设计专业教学方案.doc
- SpringCloud系列之服务总线(Bus)
- CTFHub技能树——备份文件下载
- 手把手教你做小米商城-商品展示页面
- Linux 小程序开发日记(终章)(pyqt+yolov5)