关于快速排序和归并排序的时间复杂度分析
目录
一、快排时间复杂度分析
二、归并排序时间复杂度分析
三、写在最后
一、快排时间复杂度分析
快速排序的时间复杂度在O(nlogn)~ O(n^2)之间,下面我分别分析这两种情况:
(一)快速排序的最好情况O(nlogn)
快速排序的实现方式,就是在当前区间中选择一个x,区间中所有比x小的数都需要放到x的左边,而比x大的数则放到右边。在理想的情况下,我们选取的分界点刚好就是这个区间的中位数。也就是说,在操作之后,正好将区间分成了满足数字个数相等的左右两个子区间(快排是按照值的大小划分,个数可能相等,可能不等)。此时就和归并排序基本一致了:
递归的第一层,n个数被划分为2个子区间,每个子区间的数字个数为n/2;
递归的第二层,n个数被划分为4个子区间,每个子区间的数字个数为n/4;
递归的第三层,n个数被划分为8个子区间,每个子区间的数字个数为n/8;
…
递归的第logn层,n个数被划分为n个子区间,每个子区间的数字个数为1;
以上过程与归并排序基本一致,而区别就是,归并排序是从最后一层开始进行merge操作,自底向上;而快速排序则从第一层开始交换区间中数字的位置,是自顶向下的。但是,merge操作和快速排序的调换位置操作,时间复杂度是一样的,对于每一个区间,处理的时候,都需要遍历一次区间中的每一个元素。这也就意味着,快速排序和归并排序一样,每一层的总时间复杂度都是O(n),因为需要对每一个元素遍历一次。而且在最好的情况下,同样也是有logn层,所以快速排序最好的时间复杂度为O(nlogn)。
(二)快速排序的最坏情况O(n^2)
对于每一个区间,我们在处理的时候,选取的轴刚好就是这个区间的最大值或者最小值。比如我们需要对n个数排序,而每一次进行处理的时候,选取的轴刚好都是区间的最小值。于是第一次操作,在经过调换元素顺序的操作后,最小值被放在了第一个位置,剩余n-1个数占据了2~n个位置;第二次操作,处理剩下的n-1个元素,又将这个子区间的最小值放在了当前区间的第1个位置,以此类推…每次操作,都只能将最小值放到第一个位置,而剩下的元素,则没有任何变化。所以对于n个数来说,需要操作n次即n层,才能为n个数排好序。而每一次操作都需要遍历一次剩下的所有元素,这个操作的时间复杂度是O(n),所以总时间复杂度为O(n^2)。
其实上面的过程,我们可以换一个角度理解:每次操作,找出最小值放到剩余区间的第一个位置,这不就是选择排序的实现方式吗?而选择排序的时间复杂度就是O(n ^ 2),所以上面的过程也就O(n^2)。
二、归并排序时间复杂度分析
归并排序的时间复杂度是O(nlogn),且这个时间复杂度是稳定的,不随需要排序的序列不同而产生波动。下面我来分析一下~
假设我们需要对一个包含n个数的序列使用归并排序,并且使用的是递归的实现方式,那么过程如下:
递归的第一层,将n个数划分为2个子区间,每个子区间的数字个数为n/2;
递归的第二层,将n个数划分为4个子区间,每个子区间的数字个数为n/4;
递归的第三层,将n个数划分为8个子区间,每个子区间的数字个数为n/8;
…
递归的第logn层,将n个数划分为n个子区间,每个子区间的数字个数为1;
在整个归并排序的过程中,每一层的子区间,长度都是上一层的1/2。分析可知,当子区间的长度为1时,共划分了logn层。而归并排序的merge操作,则是从最底层开始(子区间为1的层),对相邻的两个子区间进行合并,过程如下:
在第logn层(最底层),每个子区间的长度为1,共n个子区间,每相邻两个子区间进行合并,总共合并n/2次。n个数字都会被遍历一次,所有这一层的总时间复杂度为O(n);
…
在第2层,每个子区间长度为n/4,总共有4个子区间,每相邻两个子区间进行合并,总共合并2次。n个数字都会被遍历一次,所以这一层的总时间复杂度为O(n);
在第1层,每个子区间长度为n/2,总共有2个子区间,只需要合并一次。n个数字都会被遍历一次,所以这一层的总时间复杂度为O(n);
通过上面的过程我们可以发现,对于每一层来说,在合并所有子区间的过程中,n个元素都会被操作一次,所以每一层的时间复杂度都是O(n),共有logn层,所以归并排序的时间复杂度就是O(nlogn)。
————————————————
版权声明:本文为CSDN博主「qing小星星」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_64565994/article/details/125253331
关于快速排序和归并排序的时间复杂度分析相关推荐
- 希尔排序、快速排序、归并排序的实现分析以及时间复杂度
高级排序 希尔排序 快速排序 归并排序 希尔排序 希尔排序是插入排序的一种,又称"缩小增量排序",是插入排序算法的一种更高效的改进版本. 我在另一篇文章中说插入排序的时候,会有一个 ...
- 二路归并排序及时间复杂度分析
序言 二路归并排序是一种效率极高的递归排序,将数组A化为有序数组时间复杂度为O(nlogn). 思想 二路归并排序分为拆分数组以及合并两个操作. 切分(自上而下)时间复杂度2*T(n/2) 每次从数组 ...
- 排序算法-归并排序的时间复杂度分析
归并排序,其实就是递归+合并. 归并排序将数组取中间分为两部分,两个子数组分别各自再从中间分为两个子数组,一直分下去直到不能再分.分完之后,再按照子数组大小合并为为一个有序数组,然后层层向上合并,直到 ...
- 归并排序执行次数_归并排序过程、时间复杂度分析及改进
前言 上一篇文章,介绍过第一种基于分治策略的排序算法--快速排序.接下来我们来讨论另一种基于分治策略的排序算法,归并排序.归并排序也被认为是一种时间复杂度最优的算法,我们还是按照基本过程,代码,最坏时 ...
- 快速排序归并排序—时间复杂度分析
引言: 大家好,我是小星星,今天要梳理的知识点是--快速排序和归并排序时间复杂度分析. 目录 一.快排时间复杂度分析 二.归并排序时间复杂度分析 三.写在最后 一.快排时间复杂度分析 快速排序的时间复 ...
- 快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记
文章目录 复习梗概 算法思想 算法复杂度分析及稳定性 如何优化? 快速排序改进版代码C++ 快速排序个人青春版代码 完整代码 复习梗概 算法思想,别的排序名字直接就能让人联想到它的算法思想,唯独快速排 ...
- 快速排序的时间复杂度分析
快速排序的时间复杂度分析 先说结论: 最坏情况:O(N2)O(N^{2})O(N2) 最好情况和平均情况:O(NlogN)O(NlogN)O(NlogN) 下面开始分析. 假设一个序列共有 N 个元素 ...
- 排序算法-归并排序的实现与时间复杂度分析
归并排序 归并排序是分而治之的排序算法. 划分步骤很简单:将当前数组分成两半(如果N是偶数,则将其完全平等,或者如果N是奇数,则一边稍大于一个元素),然后递归地对这两半进行排序. 递归写法 归并排序递 ...
- 排序算法-快速排序的时间复杂度分析
快速排序的思想是在数组[p,r]中选择一个分区点q,将数组一分为2,同时将小于分区点的数值的放到分区点左侧[p,q-1],大于分区点的数值的放到分区点右侧[q+1,r],重复这个过程. 快速排序也是用 ...
最新文章
- 重新格式化NameNode后,DataNode启动不起来问题解决
- Function接口练习之按照指定要求操作数据
- PHP中的include、include_once、require、require_once
- 583. 两个字符串的删除操作
- maven项目导出为jar包
- 简单的签到代码_签到功能,用 MySQL 还是 Redis ?
- Linux下如何查找nginx配置文件的位置
- 实习成长之路: MySQL三 : 事务隔离:为什么你改了我还看不见?
- 表情商店竞争加剧,陌陌和微信的“另一桩”生意
- 简述游戏抽奖机制运用的心理学知识(上)
- MMQ 开源免费 同时支持分布式架构和数据持久化、规则引擎、ACL的MQTT broker。
- android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
- Spring MVC的数据绑定(简单数据绑定+POJO类型绑定)
- 基于高分辨率影像城市绿地信息提取_[转]ENVI支持下利用高分辨率影像城市绿地信息提取方案...
- 情人节主题的公众号图文排版怎样设计最走心?
- python读取.tsv文件例子(大文件处理)
- 关于测绘专业软件时的一些感悟
- ElasticSearch第三讲 ES-docker-Compose集群部署证书认证
- pdm系统怎么删除服务器,完全卸载Solidworks Enterprise PDM方法
- ADS1292检测原理及其驱动