六、Analysis of quicksort

1 引言

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

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

2 Quicksort

2.1 算法描述

在这里插入图片描述
在这里插入图片描述

2.2 手工演示

  • 指针 i i i指示的是 ≤ p i v o t \leq pivot pivot的最后一个,作用是是用来标记 ≤ p i v o t \leq pivot pivot ≥ p i v o t \geq pivot pivot的分割状态,指针 j j j用来遍历所有元素,每遍历一个元素都会和 p i v o t pivot pivot比较,不断更新 i i i的指示状态。
    在这里插入图片描述

2.3 实现

# -*- coding: utf-8 -*-


def PARTITION(A, p, r):
    x = A[r]
    i = p - 1
    for j in range(p, r):
        if A[j] <= x:
            i = i + 1
            A[i], A[j] = A[j], A[i]
    A[i + 1], A[r] = A[r], A[i + 1]
    return i + 1


def 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 ) = Θ ( n l o g n ) T(n)=\Theta(nlogn) T(n)=Θ(nlogn)

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

下面看一种感觉直觉上很差,其实效果很好的情况。
在这里插入图片描述
使用递归树分析:
在这里插入图片描述

  • 注意 l o g 10 9 n / l o g 2 n = l o g 10 9 2 log_{\frac{10}{9}}n/log_{2}n = log_{\frac{10}{9}}2 log910n/log2n=log9102,这是一个常数。

3.4 worst best交替情况

在这里插入图片描述

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

3.5 random case

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

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

  • 至此,已经进入到概率框架,可以暂时忘记之前的算法问题背景:
    在这里插入图片描述

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

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

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

在这里插入图片描述

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

  • 使用数学归纳法证明 E [ T ( n ) ] ≤ a n l g n E[T(n)] ≤ an lg n E[T(n)]anlgn
    在这里插入图片描述

4 总结

  • 从上面的分析中可以看到,快速排序大概率是 Θ ( n l o g n ) \Theta(nlogn) Θ(nlogn)的,在实际应用中快速排序往往是归并排序速度的2倍以上,如果在细节上对算法微调,则可以表现出更好的性能.
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值