我们来分析一下快速排序法的性能。快速排序的时间性能取决于快速排序递归的深度,可以用递归树来描述递归算法的执行情况。如图9‐9‐7所示,它是{50,10,90,30, 70,40,80,60,20}在快速排序过程中的递归过程。由于我们的第一个关键字是50,正好是待排序的序列的中间值,因此递归树是平衡的,此时性能也比较好。

 
图9-9-7

在最优情况下,Partition每次都划分得很均匀,如果排序n个关键字,其递归树的深度就为.log2n.+1(.x.表示不大于x的最大整数),即仅需递归log2n次,需要时间为T(n)的话,第一次Partiation应该是需要对整个数组扫描一遍,做n次比较。然后,获得的枢轴将数组一分为二,那么各自还需要T(n/2)的时间(注意是最好情况,所以平分两半)。于是不断地划分下去,我们就有了下面的不等式推断。

  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. ……
  5. T(n)≤nT(1)+(log2n)×n= O(nlogn)

也就是说,在最优的情况下,快速排序算法的时间复杂度为O(nlogn)。

在最坏的情况下,待排序的序列为正序或者逆序,每次划分只得到一个比上一次划分少一个记录的子序列,注意另一个为空。如果递归树画出来,它就是一棵斜树。此时需要执行n‐1次递归调用,且第i次划分需要经过n‐i次关键字的比较才能找到第i个记录,也就是枢轴的位置,因此比较次数为 ,最终其时间复杂度为O(n2)。

平均的情况,设枢轴的关键字应该在第k的位置(1≤k≤n),那么:

 

由数学归纳法可证明,其数量级为O(nlogn)。

就空间复杂度来说,主要是递归造成的栈空间的使用,最好情况,递归树的深度为log2n,其空间复杂度也就为O(logn),最坏情况,需要进行n‐1递归调用,其空间复杂度为O(n),平均情况,空间复杂度也为O(logn)。

可惜的是,由于关键字的比较和交换是跳跃进行的,因此,快速排序是一种不稳定的排序方法。

来源:http://blog.csdn.net/weshjiness/article/details/8660583

快速排序最好,最坏,平均复杂度分析相关推荐

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

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

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

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

  3. (1)复杂度分析原理与方法

    数据结构&算法模块总结 (1)复杂度分析原理与方法 (2)数组与链表原理和使用场景讲解 (3)栈原理与应用场景讲解 (4)队列原理与应用场景讲解 (5)递归原理与虚拟机栈场景应用 (6)二分查 ...

  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. 快速排序:最好,最坏以及平均复杂度推导理解

    算法简介: 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列. 步骤为: 挑选基准值:从数列中挑出一个元素,称 ...

  8. 【排序综合】直接插入排序,希尔排序,快速排序,堆排序,冒泡排序,简单选择排序的简介,实现和算法复杂度分析

    目录 1. 直接插入排序 1.1 直接插入排序简介 1. 什么是直接插入排序 2. 排序思想 1.2 排序实现 1. 排序代码 2. 复杂度分析: 3. 运行结果: 1.3 学习链接 2. 希尔排序( ...

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

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

最新文章

  1. css属性选择符的应用
  2. PHP5.6版本“No input file specified”问题
  3. Django搭建简易博客教程(四)-Models
  4. C#将内容导出到Word到指定模板
  5. java set的first_Java Pair.setFirst方法代码示例
  6. java rest框架_比较Java REST文档框架
  7. shell 字典_腾讯T4周末不陪对象,就为了手打这份shell编程笔记
  8. 启动访问kibana
  9. JBoss Tools安装
  10. windows下SBT的安装与使用
  11. (五)深度学习和ResNet50的COVID-19诊断结果
  12. LINUX 游戏服务器之旅4_mongodb环境
  13. java rector_Java IO的Reactor模式
  14. 1168: mxh对lfx的询问(前缀和+素数表)
  15. 求到达必败态的方法数 ZOJ 3067 Nim
  16. mysql sphinx_Sphinx的安装和使用(仅学习)
  17. iOS客户端如何测试推送
  18. 《Sony Vegas Pro 12标准教程》—— 2.6 添加背景音乐
  19. java晋升述职_阿里感悟(九)-如何才能晋升
  20. 温故而知新--Java基础(三):Java常用集合类(上)

热门文章

  1. php 类定义抽象方法吗,PHP面向对象:接口与抽象方法
  2. 04_Nginx命令行参数,控制信号,Nginx启动、停止、重启命令
  3. 4.QT中进程操作,线程操作
  4. Java Swing编程:JTable表格
  5. Java GUI中实现文件拷贝
  6. 元素周期表超清pdf_重磅分享||化学II卷5个大题汇编PDF
  7. chromiumfx 4.5_巴中的朋友看过来,大型线上车展来了,开拓者最高综合优惠4.5万!...
  8. SSD训练自己的数据集
  9. FastMaskRCNN算法TensorFlow配置,训练
  10. faster rcnn windows 下c++版本