算法简介:

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。

步骤为:

  1. 挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),
  2. 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成,
  3. 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。

递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。

选取基准值有数种具体方法,此选取方法对排序的时间性能有决定性影响。

时间复杂度:

最好情形:

数学归纳法推导:

  1. T(n)≤ 2T(n/2) + n,T(1)= 0
  2. T(n)≤ 2(2T(n/4)+ n/2) +n = 4T(n/4)+ 2n
  3. T(n)≤ 4(2T(n/8)+ n/4) +2n = 8T(n/8)+ 3n
  4. T(n)< 8(2(T(n/16)+ n/8)+3n = 16T(n/16)+ 4n
  5. ……
  6. 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

快速排序:最好,最坏以及平均复杂度推导理解相关推荐

  1. 算法 - 最好、最坏、平均复杂度

    注:本文仅为笔记. 原文 极客时间 - 数据结构与算法之美 - 04 | 复杂度分析(下):浅析最好.最坏.平均.均摊时间复杂度 最好.最坏时间复杂度 略,比较容易分析. 平均时间复杂度 需考虑概率来 ...

  2. 快速排序最好,最坏,平均复杂度分析

    我们来分析一下快速排序法的性能.快速排序的时间性能取决于快速排序递归的深度,可以用递归树来描述递归算法的执行情况.如图9‐9‐7所示,它是{50,10,90,30, 70,40,80,60,20}在快 ...

  3. 算法复杂度分析(下):最好、最坏、平均、均摊等时间复杂度概述

    细化时间复杂度分析 代码千千万,有些代码逻辑会很复杂,所以为了更细化的分析算法的复杂度,再复杂度分析方面引入了4个知识点: 1.最好情况时间复杂度(best case time complexity) ...

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

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

  5. 04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

    // n表示数组array的长度 int find(int[] array, int n, int x) {int i = 0;int pos = -1;for (; i < n; ++i) { ...

  6. 【数据结构与算法-java实现】二 复杂度分析(下):最好、最坏、平均、均摊时间复杂度的概念

    上一篇文章学习了:如何分析.统计算法的执行效率和资源消耗? 点击链接查看上一篇文章:复杂度分析上 今天的文章学习以下内容: 最好情况时间复杂度 最坏情况时间复杂度 平均情况时间复杂度 均摊时间复杂度 ...

  7. 第3课:算法复杂度分析(下):最好、最坏、平均、均摊时间复杂度

    目录 最好.最坏时间复杂度 平均情况时间复杂度 均摊时间复杂度 小结 最好.最坏时间复杂度 我们先看一个例子: /*例1:查找x在数组中出现的位置,如果没有找到,返回-1.n表示数组array的长度 ...

  8. 3.最好、最坏、平均、均摊时间复杂度

    关注公众号 MageByte,设置星标点「在看」是我们创造好文的动力.后台回复 "加群" 进入技术交流群获更多技术成长. 本文来自 MageByte-青叶编写 上次我们说过 时间复 ...

  9. 3L-最好、最坏、平均、均摊时间复杂度

    关注公众号 MageByte,设置星标点「在看」是我们创造好文的动力.后台回复 "加群" 进入技术交流群获更多技术成长. 本文来自 MageByte-青叶编写 上次我们说过 时间复 ...

最新文章

  1. c++ 之动态数组简单介绍
  2. Linux网络编程 | Socket编程(一):Socket的介绍、UDPSocket的封装、UDP服务器/客户端的实现
  3. recv和send函数
  4. cuda以及cudnn下载慢的问题解决!
  5. dubbo源码解析-spi(四)
  6. 【转载】python做图像的傅里叶变换——二维傅里叶变换
  7. AcWing 1319. 移棋子游戏(sg 博弈)
  8. 阿里Sophix 集成
  9. 物联网:Android端控制ZigBee实现生产环境自动控制
  10. Win10系统下如何设置共享打印机
  11. hdu 3853 LOOPS
  12. 怎样正确理解LOOPBACK接口?
  13. [算法]LeetCode 专题 -- 二分查找专题 34. 在排序数组中查找元素的第一个和最后一个位置
  14. 美国在PC处理器市场的垄断被ARM打破,国产处理器也取得了突破
  15. pytorch优化器详解:SGD
  16. 调用百度短网址API接口进行短网址的转换(Java程序的实现)
  17. vue调用百度地图文档与说明
  18. 现代密码学期末复习总结(个人整理自存)
  19. 戴尔t420服务器显示器无信号,显示器无信号的原因及解决方法
  20. 辗转相除以及辗转相减法

热门文章

  1. 网页升级页面的样式优化
  2. 【第一回】曹操计用优惠券 孔明火烧博望坡
  3. 西门子1200硬件上载与软件上载
  4. python批量打印网页_用Python批量打印定制的HTML页面
  5. 变换域信息隐藏--DCT
  6. npm安装时卡在sill idealTree buildDeps,npm安装速度慢,npm安装卡在一个地方不动
  7. uni-app实战之社区交友APP(3)Vue.js和uni-app基础
  8. 开源运维监控工具WGCLOUD - 功能概述及架构介绍(理论篇)
  9. python编写程序、从键盘输入一个年份_Python 编写程序,从键盘输入年月日,判断是当年的第几天。...
  10. 计算机中倒v符号,电脑倒过来的问号怎么打?特殊符号倒问号输入的方法