快速排序的最优时间复杂度是 \(O(nlogn)\),最差时间复杂度是 \(O(n^2)\),期望时间复杂度是 \(O(nlogn)\)。

这里我们证明一下快排的期望时间复杂度。

设 \(T(n)\) 为对长度为 \(n\) 的序列进行快速排序所需要的期望时间。我们有:

\[T(0) = 0\]

以及: \[T(n) = n + \frac{1}{n}\sum_{i=0}^{n-1}(T(i) + T(n - i - 1))\]

我们可以通过放缩来获得对 \(T(n)\) 上界的一个估计。

\[T(n) = n + \frac{1}{n}\sum_{i=0}^{n-1}(T(i) + T(n - i - 1))\]
\[ = n + \frac{2}{n}\sum_{i=\frac{2}{n}}^{n-1}(T(i) + T(n - i - 1))\]
\[ = n + \frac{2}{n}\sum_{i=\frac{2}{n}}^{\frac{3n}{4}}(T(i) + T(n - i - 1)) + \frac{2}{n}\sum_{i=\frac{3n}{4}}^{n-1}(T(i) + T(n - i - 1)) \]

因为 \(T(n) >= n\) , 所以对于 \(\frac{n}{2} <= i <= j\),我们显然有:

\[T(i) + T(n - i) <= T(j) + T(n - j)\]

所以:

\[T(n) <= n + \frac{2}{n}\sum_{i=\frac{2}{n}}^{\frac{3n}{4}}(T(\frac{3n}{4}) + T(\frac{n}{4})) + \frac{2}{n}\sum_{i=\frac{3n}{4}}^{n-1}(T(n - 1) + T(0))\]
\[<= n + \frac{1}{2}(T(\frac{3n}{4}) + T(\frac{n}{4})) + \frac{1}{2}T(n-1) \]

我们要证明 \(T(n) = O(nlogn)\) , 这需要证明存在常数 \(c\) 满足 \(T(n) <= cnlogn\)。

我们考虑用数学归纳法证明。\(n = 0\)时定理显然成立。现在假设对于 \(m <= n\) 定理皆成立。那么:

\[T(n) <= n + \frac{1}{2}(T(\frac{3n}{4}) + T(\frac{n}{4})) + \frac{1}{2}T(n-1) \]

\[<= n +\frac{1}{2}(c(\frac{3n}{4})log(\frac{3n}{4}) + c(\frac{n}{4})log(\frac{n}{4})) + \frac{1}{2}c(n-1)log(n-1)\]

\[<= n +c(\frac{3n}{8}log(n) - \frac{3n}{8}log(\frac{4}{3}) + \frac{n}{8}log(n) - \frac{n}{8}log(4) + \frac{n}{2}log(n))\]

\[= cnlogn + n(1 - \frac{3c}{8}log(\frac{4}{3}) - \frac{c}{4})\]

当 \(1 - \frac{3c}{8}log(\frac{4}{3}) - \frac{c}{4} <= 0\) 时,也即约 \(c >= \frac{5}{2}\),我们有:

\[T(n) <= cnlogn\].

归纳成立,\(T(n) = O(nlogn)\).

快速排序的期望复杂度O(nlogn)证明。的更多相关文章

  1. 建堆复杂度O(n)证明

    堆排序中首先需要做的就是建堆,广为人知的是建堆复杂度才O(n),它的证明过程涉及到高等数学中的级数或者概率论,不过证明整体来讲是比较易懂的. 堆排过程 代码如下 void print(vector&l ...

  2. 快速排序原理、复杂度分析及C语言实现

    本文作者华科小涛:@http://www.cnblogs.com/hust-ghtao/,参考<算法导论>,代码借用<剑指offer> 快速排序是一种最坏情况时间复杂度为的排序 ...

  3. 改进版高速排序(平均复杂度O(NlogN))

    #include<iostream> using namespace std; #define MAXSIZE 21 typedef int SqList[MAXSIZE]; #defin ...

  4. ZROI 19.08.03 分治与离线

    经典问题,给一张图,支持加边/删边/询问两点连通性. 离线统计边权(删除时间),lct维护最大生成树即可. 也可以按时间分治,维护一个可回退并查集即可. 主定理 很好用,但是记不住. 有一种简明的替代 ...

  5. 算法初步(julyedu网课整理)

    date: 2018-11-19 13:41:29 updated: 2018-11-19 14:31:04 算法初步(julyedu网课整理) 1 O(1) 基本运算 O(logn) 二分查找 分治 ...

  6. COGS 2421.[HZOI 2016]简单的Treap 题解

    题目大意: 给定n个数及其优先级,求对应的符合最小堆性质的Treap的先序遍历. n<=500000. 解法: 目前为止我只想到了三种解法,其中第三种是正解. 1.暴力1 以优先级为关键字排序, ...

  7. 「LuoguP3252」 [JLOI2012]树

    Description 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深 ...

  8. 快速排序时间复杂度为O(n×log(n))的证明

    快速排序时间复杂度为O(n×log(n))的证明 之前只知道快速排序的平均时间复杂度为O(n×log(n)),最糟糕时复杂度为O(n^2),但却不知道具体原因,今天好好证明一下,最后部分摘自<算 ...

  9. 三角形问题的解决复杂度O(n^3)和O(nlogn)的比较

    问题描述: n条棍子组成一个三角形,使得三角形周少最大. 方法一: 暴力解则算法复杂度为O(n^3) #include<stdio.h> const int MAX_N=105 int m ...

随机推荐

  1. Android 使用DrawerLayout高速实现側滑菜单

    一.概述 DrawerLayout是一个能够方便的实现Android側滑菜单的组件,我近期开发的项目中也有一个側滑菜单的功能.于是DrawerLayout就派上用场了.假设你从未使用过DrawerLa ...

  2. BNU 34974 MATLAB大法好

    题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=34974 MATLAB大法好  Time Limit: 8000ms Memory Limi ...

  3. mysql---union的使用方法

    union的作用非常easy用来合并两条sql的结果集 语法: SQL1 UNION SQL2 现有一张价格表 要求:求出价格低于2000和价格高于3000的商品.不能用or和not between- ...

  4. Visual Studio2008 和2010 执行程序出现的黑框马上消失解决方法

    1 在程序最后加         system("PAUSE");  要注意包括头文件#include"stdlib.h"   //system须要调用这个   ...

  5. Android 中图能够用到的图片处理类 BitmapUtils

    Android在实际开发中非常多时候都要对图片进行一定的处理,这里总结的BitmapUtils 类包含一下几个功能: 1.Android图片倒影, 2.Android图片模糊处理, 3.Android ...

  6. MKVToolNix v8.2

    32位版:http://pan.baidu.com/s/1i3s4gGd 64位版: http://pan.baidu.com/s/1gdvqbpp

  7. mysql通过DATE_FORMAT将错误数据恢复

    因为如今新开发项目,同事造数据的时候,将时间类型格式造成"20150708".可是实际希望的数据格式是:"2015-07-08" . 数据库使用的是mysql. ...

  8. JAVA线程队列BlockingQueue

    JAVA线程队列BlockingQueue 介绍 BlockingQueue阻塞队列,顾名思义,首先它是一个队列,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出. 常用的队列主要有以 ...

  9. tee---将数据重定向到文件,

    tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin.简单的说就是把数据重定向到给定文件和屏幕上. 存在缓存机制,每1024个字节将输出一次.若从管道接收输 ...

  10. PHP获取一周后的时间戳

    echo strtotime("now");//相当于将英文单词now直接等于现在的日期和时间,并把这个日期时间转化为unix时间戳.这个效果跟echo time();一样. ec ...