快速排序:最好,最坏以及平均复杂度推导理解
算法简介:
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。
步骤为:
- 挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),
- 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成,
- 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。
递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。
选取基准值有数种具体方法,此选取方法对排序的时间性能有决定性影响。
时间复杂度:
最好情形:
数学归纳法推导:
- T(n)≤ 2T(n/2) + n,T(1)= 0
- T(n)≤ 2(2T(n/4)+ n/2) +n = 4T(n/4)+ 2n
- T(n)≤ 4(2T(n/8)+ n/4) +2n = 8T(n/8)+ 3n
- T(n)< 8(2(T(n/16)+ n/8)+3n = 16T(n/16)+ 4n
- ……
- T(n)≤nT(1)+(log2n)×n= O(nlogn)
理解:
如下图,最优情况下,每次找到的参考轴把数据分成均匀的两半,最后应该是一个平衡二叉树状态;二叉树的层数(logn)即为递归需要进行的次数,并且每轮递归结束时,都将二叉树遍历了一遍(n),所以最优的情况下,时间复杂度为O(nlogn)
最坏情形:
最坏情形下,为正序或逆序排列,二叉树画出来应该是一棵斜树,并且需要经过n-1次递归调用才能完成,且第i次划分需要经过n‐i次关键字的比较才能找到第i个记录,也就是枢轴的位置,所以:
最终的时间复杂度应该O(n2)
平均复杂度:
枢轴可以随机的在第k的位置(1≤k≤n):
n-1是分割所使用的比较次数。因为基准值是相当均匀地落在排列好的数列次序之任何地方,总和就是所有可能分割的平均。
这个意思是,平均上快速排序比理想的比较次数,也就是最好情况下,只大约比较糟39%。这意味着,它比最坏情况较接近最好情况。这个快速的平均运行时间,是快速排序比其他排序算法有实际的优势之另一个原因。
空间复杂度
空间的消耗主要是递归造成的栈空间使用,最好情况,递归树的深度为log2n,其空间复杂度也就为O(logn),最坏情况,需要进行n‐1递归调用,其空间复杂度为O(n),平均情况,空间复杂度也为O(logn)。
参考:
https://blog.csdn.net/weshjiness/article/details/8660583
https://zh.wikipedia.org/zh/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F
快速排序:最好,最坏以及平均复杂度推导理解相关推荐
- 算法 - 最好、最坏、平均复杂度
注:本文仅为笔记. 原文 极客时间 - 数据结构与算法之美 - 04 | 复杂度分析(下):浅析最好.最坏.平均.均摊时间复杂度 最好.最坏时间复杂度 略,比较容易分析. 平均时间复杂度 需考虑概率来 ...
- 快速排序最好,最坏,平均复杂度分析
我们来分析一下快速排序法的性能.快速排序的时间性能取决于快速排序递归的深度,可以用递归树来描述递归算法的执行情况.如图9‐9‐7所示,它是{50,10,90,30, 70,40,80,60,20}在快 ...
- 算法复杂度分析(下):最好、最坏、平均、均摊等时间复杂度概述
细化时间复杂度分析 代码千千万,有些代码逻辑会很复杂,所以为了更细化的分析算法的复杂度,再复杂度分析方面引入了4个知识点: 1.最好情况时间复杂度(best case time complexity) ...
- 算法笔记(一):复杂度分析:最好、最坏、平均、均摊
数据结构指的是"一组数据的存储结构", 算法指的是"操作数据的一组方法". 数据结构是为算法服务的,算法是要作用再特定的数据结构上的. 效率和资源消耗的度量衡- ...
- 04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度
// n表示数组array的长度 int find(int[] array, int n, int x) {int i = 0;int pos = -1;for (; i < n; ++i) { ...
- 【数据结构与算法-java实现】二 复杂度分析(下):最好、最坏、平均、均摊时间复杂度的概念
上一篇文章学习了:如何分析.统计算法的执行效率和资源消耗? 点击链接查看上一篇文章:复杂度分析上 今天的文章学习以下内容: 最好情况时间复杂度 最坏情况时间复杂度 平均情况时间复杂度 均摊时间复杂度 ...
- 第3课:算法复杂度分析(下):最好、最坏、平均、均摊时间复杂度
目录 最好.最坏时间复杂度 平均情况时间复杂度 均摊时间复杂度 小结 最好.最坏时间复杂度 我们先看一个例子: /*例1:查找x在数组中出现的位置,如果没有找到,返回-1.n表示数组array的长度 ...
- 3.最好、最坏、平均、均摊时间复杂度
关注公众号 MageByte,设置星标点「在看」是我们创造好文的动力.后台回复 "加群" 进入技术交流群获更多技术成长. 本文来自 MageByte-青叶编写 上次我们说过 时间复 ...
- 3L-最好、最坏、平均、均摊时间复杂度
关注公众号 MageByte,设置星标点「在看」是我们创造好文的动力.后台回复 "加群" 进入技术交流群获更多技术成长. 本文来自 MageByte-青叶编写 上次我们说过 时间复 ...
最新文章
- c++ 之动态数组简单介绍
- Linux网络编程 | Socket编程(一):Socket的介绍、UDPSocket的封装、UDP服务器/客户端的实现
- recv和send函数
- cuda以及cudnn下载慢的问题解决!
- dubbo源码解析-spi(四)
- 【转载】python做图像的傅里叶变换——二维傅里叶变换
- AcWing 1319. 移棋子游戏(sg 博弈)
- 阿里Sophix 集成
- 物联网:Android端控制ZigBee实现生产环境自动控制
- Win10系统下如何设置共享打印机
- hdu 3853 LOOPS
- 怎样正确理解LOOPBACK接口?
- [算法]LeetCode 专题 -- 二分查找专题 34. 在排序数组中查找元素的第一个和最后一个位置
- 美国在PC处理器市场的垄断被ARM打破,国产处理器也取得了突破
- pytorch优化器详解:SGD
- 调用百度短网址API接口进行短网址的转换(Java程序的实现)
- vue调用百度地图文档与说明
- 现代密码学期末复习总结(个人整理自存)
- 戴尔t420服务器显示器无信号,显示器无信号的原因及解决方法
- 辗转相除以及辗转相减法
热门文章
- 网页升级页面的样式优化
- 【第一回】曹操计用优惠券 孔明火烧博望坡
- 西门子1200硬件上载与软件上载
- python批量打印网页_用Python批量打印定制的HTML页面
- 变换域信息隐藏--DCT
- npm安装时卡在sill idealTree buildDeps,npm安装速度慢,npm安装卡在一个地方不动
- uni-app实战之社区交友APP(3)Vue.js和uni-app基础
- 开源运维监控工具WGCLOUD - 功能概述及架构介绍(理论篇)
- python编写程序、从键盘输入一个年份_Python 编写程序,从键盘输入年月日,判断是当年的第几天。...
- 计算机中倒v符号,电脑倒过来的问号怎么打?特殊符号倒问号输入的方法