1 引言

如题目所示,本节的精华在于用数学解决一个直觉上看似纷乱复杂的问题,里面有一些一般性的分析方法,如引入Indicator变量,从而把不确定问题引入到概率框架进行分析,一步一步把直觉上混乱的问题理清楚,数学之美也就是如此吧!

如果有个算法在某些情况下表现的很差,在某些情况下又表现的不错,那么你还会放心的使用该算法吗?通过下面的分析后你会很放心使用快速排序算法。

2 Quicksort

2.1 算法描述


2.2 手工演示

  • 指针iii指示的是≤pivot\leq pivot≤pivot的最后一个,作用是是用来标记≤pivot\leq pivot≤pivot和≥pivot\geq pivot≥pivot的分割状态,指针jjj用来遍历所有元素,每遍历一个元素都会和pivotpivotpivot比较,不断更新iii的指示状态。

2.3 实现

# -*- coding: utf-8 -*-def PARTITION(A, p, r):x = A[r]i = p - 1for j in range(p, r):if A[j] <= x:i = i + 1A[i], A[j] = A[j], A[i]A[i + 1], A[r] = A[r], A[i + 1]return i + 1def QUICK_SORT(A, p, r):if p < r:q = PARTITION(A, p, r)QUICK_SORT(A, p, q - 1)QUICK_SORT(A, q + 1, r)if __name__ == '__main__':A = ['x', 2, 8, 7, 1, 3, 5, 6, 4]print('before sort:', A[1:])QUICK_SORT(A, 1, len(A) - 1)print('after sort:', A[1:])

运行结果:

before sort: [2, 8, 7, 1, 3, 5, 6, 4]
after sort: [1, 2, 3, 4, 5, 6, 7, 8]

3 Analysis of quicksort

3.1 worst case


用递归树分析如下:

3.2 best case


应用主定理容易得到T(n)=Θ(nlogn)T(n)=\Theta(nlogn)T(n)=Θ(nlogn)。

3.3 110,910\frac{1}{10}, \frac{9}{10}101​,109​case

下面看一种感觉直觉上很差,其实效果很好的情况。

使用递归树分析:

  • 注意log109n/log2n=log1092log_{\frac{10}{9}}n/log_{2}n = log_{\frac{10}{9}}2log910​​n/log2​n=log910​​2,这是一个常数。

3.4 worst best交替情况

  • 好坏交替的情况下,最后仍然是好的!

3.5 random case

上面从矛盾的特殊性上让直觉有一个直观的感受,只要不是特别极端(如一个初始状态是逆序的数列),貌似大部分情况下都是ok的,下面用概率框架确认这种直观的感觉是正确的。

  • 对于离散不确定问题,要引入概率框架进行讨论,首先要引入一个合适的随机变量,这里引入指示器(Indicator)随机变量,这个变量在机器学习算法中使用更为广泛,看似简单的一个定义,却可以化繁为简的用一个表达式表示所有情况。

  • 至此,已经进入到概率框架,可以暂时忘记之前的算法问题背景:

  • 概率世界都是是不确定的,研究概率大目的是找出不确定问题的平均特性,如期望、方差等,这里只关注期望。

  • 下面的推到中用到了期望的线性可加性和独立可乘性。

分割的独立性:第一次分割后,数组分为第a部分和第b部分,a部分具体在哪个位置分割已经和第一次分割没有关系。

  • 猜想E[T(n)]≤anlgnE[T(n)] ≤ an lg nE[T(n)]≤anlgn,a足够大,接下来数学归纳法要登场了!,首先有一个数学事实要知道,这个结论也是用数学归纳法容易证明:

  • 使用数学归纳法证明E[T(n)]≤anlgnE[T(n)] ≤ an lg nE[T(n)]≤anlgn

4 总结

  • 从上面的分析中可以看到,快速排序大概率是Θ(nlogn)\Theta(nlogn)Θ(nlogn)的,在实际应用中快速排序往往是归并排序速度的2倍以上,如果在细节上对算法微调,则可以表现出更好的性能.

六、Analysis of quicksort相关推荐

  1. 我见过的最漂亮代码---通过删除代码来实现功能的提升

    我曾经听一位大师级的程序员这样称赞到,"我通过删除代码来实现功能的提升."而法国著名作家兼飞行家Antoine de Saint-Exupéry的说法则更具代表性,"只有 ...

  2. 快速排序总结,Python版

    快速排序是面试最常考内容, 让你描述算法, 让你写算法, 让你分析时间复杂度 #快速排序整理'''九章算法令狐冲老师排序思路: 先取到中心index对应的数组值 循环从左边找到第一个比中间值大的数字 ...

  3. 快速排序多种方法代码Python

    ''' 六.快速排序 QuickSort介绍: 快速排序通常明显比同为Ο(n log n)的其他算法更快,因此常被采用,而且快排采用了分治法的思想,所以在很多笔试面试中能经常看到快排的影子. 可见掌握 ...

  4. Python实现经典七种排序算法

    #2018-06-02 June Saturday the 22 week, the 153 day SZ #数组排序算法大全用Python3实现 #参考https://www.cnblogs.com ...

  5. 八大排序详解-超详细

    目录 概述 一,选择排序-直接插入排序(Direct insertion sort) 二,插入排序-希尔排序(Shell sort) 三,选择排序-简单选择排序(Simple selection so ...

  6. 排序算法总结(Python版)

    经典排序算法总结与实现 经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,这次收集整理并用Python实现了八大经典排序算法,包括冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序, ...

  7. Paper reading (六十五):Kernel-penalized regression for analysis of microbiome data

    论文题目:Kernel-penalized regression for analysis of microbiome data scholar 引用:15 页数:29 发表时间:2018.03 发表 ...

  8. 什么是六顶思考帽子? / What is Six Think Hat in Strategic Analysis?

    什么是六顶思考帽子?你为什么需要它?让我们来看看! 概观 六个思考帽是爱德华德博诺建议的一个系统,马耳他心理学家起源于侧向思维这个术语.六思帽为小组讨论和个人思维提供了有效的解决方案,被认为是批判性思 ...

  9. 从零开始_学_数据结构(六)——排序(冒泡、插入、希尔、简单选择、归并、快速)...

    一.冒泡排序: (1)思想是: 从第1个开始,1和2比,2和3比,3和4比,如果前面比后面大,则互相交换之,一直到n-1和n进行比.这是第一轮. 然后第二轮再从第1个开始,2和3比,3和4比,再一直比 ...

最新文章

  1. vim常用操作总结完整版
  2. 【前端】react and redux教程学习实践,浅显易懂的实践学习方法。
  3. Nervos 双周报第 3 期:佛系新年之后的开工大吉!
  4. “一带一路”谋定沿边开放发展-刘虹飞:经信研究形成共识
  5. 追了源码,做了测试,终于实现python的uvicorn日志自行配置
  6. 伯克利电子和计算机工程申请入口
  7. POJ 3621 Sightseeing Cows
  8. 【DirectX12】1.基本组件创建和绘图流程
  9. html(1)基本组成
  10. 中国人工智能学会通讯——神经环路研究最新进展及对类脑计算的启示 1.复杂科学...
  11. python int_Python int()
  12. 利用WhiteHose一步步建立分布式系统的框架(七)--添加组件的操作并实现分布式系统...
  13. 【车间调度】基于matlab遗传算法求解车间调度问题【含Matlab源码 1396期】
  14. java销毁servlet_「销毁session」Servlet销毁session - seo实验室
  15. kafka下载注意事项
  16. MTK nvram介绍
  17. 【概率论与数理统计(研究生课程)】知识点总结4(随机变量的数字特征)
  18. 欧洲杯上链,区块链语境下的数字化有什么不一样?
  19. Session-判断用户登陆验证码是否正确
  20. 净化自己的内心,扫除内心的尘埃

热门文章

  1. 前端学习(1247):购物车1
  2. 小程序页面跳转的几个方法和区别
  3. 一日一学--如何对数值型特征进行分桶
  4. 双向绑定v-bind
  5. c++ 用eclipse建立一个类,并实例化并运行
  6. [Gamma阶段]展示博客
  7. html5 拖拽上传文件时,屏蔽浏览器默认打开文件
  8. 洛谷 P3392 涂国旗
  9. [修正] Berlin 10.1 支持 iPhone 4 (iOS v7.x)
  10. iOS设计模式 - 迭代器