【算法导论】快速排序

news2024/11/29 13:36:00

文章目录

      • 1. 快速排序的描述
        • 1.1基本描述
        • 1.2 PARTITOION函数
        • 1.3 快速排序C++完整代码
      • 2. 快速排序的性能
        • 2.1 最坏时间复杂度
        • 2.2 平均时间复杂度

1. 快速排序的描述

1.1基本描述

  快速排序是一种时间复杂度为 O(n^2) 的排序算法。虽然最坏情况时间复杂度很差,但他的平均性能却很好,它的期望时间复杂度是 O(nlgn) 而且 O(nlgn) 中隐含的常数因子很小大约是1.44左右。
  快速排序与归并排序一样,也是基于归并的思想以下是对其子数组 A[ p…r ] 进行快速排序三步分治的过程:

分解:数组 A[ p…r ] 被划分为两个子数组 A[ p…q-1] 和 A[q+1…r],使得 A[ p…q-1]中的每一个元素都小于等于 A[ q ] ,而 A[ q ]也小于等于 A[ q+1…r]中的每一个元素。

解决:通过递归调用快速排序,对子数组A[ p…q-1] 和 A[q+1…r]进行排序。

合并:因为子数组都是原址排序的,所以并不需要合并操作:A[ p…r ] 已经有序。

快速排序伪代码:

QUICKSORT(A,p,r)
    if p < r
        q = PARTITION(A, p ,r)
        QUICKSORT(A, p ,q-1)
        QUICKSORT(A, q+1 ,r)

其中,q = PARTITION(A, p ,r) 所执行的操作就是分解操作,并返回 q。

1.2 PARTITOION函数


PARTITION函数伪代码:

PARTITION(A, p, r) 
    x = A[r] 
    i = p - 1 
    for j = p to r - 1 
        do if A[j] ≤ x
            then i = i + 1 
            exchange A[i] with A[j] 
exchange A[i + 1] with A[r] 
return i + 1

PARTITION函数思路简介:

  其中 0 - i 维护的是小于等于A[ r ] 的序列,A[ i+1 ] 即为比 A[ r ] 大的第一个数,j从开始节点遍历到倒数第二个节点,遇到比 A[ r ] 小的数便进行 A[ j ] 与 A[ i+1 ] 的交换,以此维护了 0 - i 序列中比 A[ r ]小的特性。j 遍历完成后,即实现了A[0…i] 小于等于 A[ r ] ,A[i+1…j] 大于 A[ r ]。

PARTITION函数执行过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

1.3 快速排序C++完整代码
# include <iostream>
using namespace std;
int PARTITION(int A[],int p,int r)
{
    int x = A[r];
    int i = p - 1;
    for(int j = p; j <= r - 1; j++)
    {
        if(A[j] <= x)
        {
            i = i + 1;
            swap(A[i],A[j]);
        }
    }
    swap(A[i+1] , A[r]);
    return i+1;
}
void QUICKSORT(int A[],int p,int r)
{
    if(p < r)
    {
        int q = PARTITION(A,p,r);
        QUICKSORT(A,p,q-1);
        QUICKSORT(A,q+1,r);
    }
}
int main()
{
    int A[100010];
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>A[i];
    }
    QUICKSORT(A,0,n-1);
    for(int i=0;i<n;i++)
    {
        cout<<A[i]<<" ";
    }
    return 0;
}

2. 快速排序的性能

2.1 最坏时间复杂度

因为无法举出使快速排序达到最坏情况的例子所以我们通过两步证明其最坏时间复杂度为 O( n^2 )

  1. 举一个例子证明其时间复杂度为 O( n 2 n^2 n2)
    当对快速排序进行分解的过程中得到的结果为一部分为 n 个元素,另一部分为0个元素时,该例的运行时间递归式为:
    T ( n ) = T ( n − 1 ) + T ( 0 ) + θ ( n ) = T ( n − 1 ) + θ ( n ) \begin{aligned}T(n) &= T(n-1)+T(0)+\theta(n)\\ &= T(n-1)+\theta(n) \end{aligned} T(n)=T(n1)+T(0)+θ(n)=T(n1)+θ(n)可以得到: T ( n ) = θ ( n 2 ) T(n)=\theta(n^2) T(n)=θ(n2)
    由此可知, Quicksort 的最坏运行时间为: Ω( n 2 n^2 n2)
  2. 证明其时间复杂度不超过 O( n 2 n^2 n2)
    设T(n)是对大小为 n 的输入进行快速排序的最坏情况时间,则有递归:
    T ( n ) = max ⁡ 0 ≤ q ≤ n − 1 ( T ( q ) + T ( n − q − 1 ) ) + C 1 n T(n)=\max_{0 \leq q\leq n-1}(T(q)+T(n-q-1))+C_1n T(n)=0qn1max(T(q)+T(nq1))+C1n我们猜测对于某个常数C使得T (n) ≤ C,将这个猜测代入上面的递推式,我们得到:
    T ( n ) ≤ max ⁡ 0 ≤ q ≤ n − 1 ( C q 2 + C ( n − q − 1 ) 2 ) + C 1 n = C ∗ max ⁡ 0 ≤ q ≤ n − 1 ( q 2 + ( n − 1 − q ) 2 ) + C 1 n \begin{aligned}T(n)&\leq \max_{0 \leq q\leq n-1}(Cq^2+C(n-q-1)^2)+C_1n\\&=C* \max_{0 \leq q\leq n-1}(q^2+(n-1-q)^2)+C_1n\end{aligned} T(n)0qn1max(Cq2+C(nq1)2)+C1n=C0qn1max(q2+(n1q)2)+C1n由于 q 2 + ( n − 1 − q ) 2 q^2+(n-1-q)^2 q2+(n1q)2 q q q 的二次函数,求导可得,在区间 [1… n ] 范围内该函数只可能在 q = 1 , q = n , q = n / 4 q = 1,q = n,q = n/4 q=1q=nq=n/4,等三个点处取极值,由此可知:
    ∑ 0 ≤ q ≤ n − 1 ( q 2 + ( n − 1 − q ) 2 ) ≤ n 2 \sum_{0 \leq q\leq n-1}(q^2+(n-1-q)^2) \leq n^2 0qn1(q2+(n1q)2)n2所以有:
    T ( n ) ≤ C ( n − 1 ) 2 + C 1 n = C ∗ n 2 − 2 C n + C 1 n + C T(n)\leq C(n-1)^2+C_1n=C*n^2-2Cn+C_1n+C T(n)C(n1)2+C1n=Cn22Cn+C1n+C当取 C > C1 时, T ( n ) < = C n 2 T (n)<=Cn^2 T(n)<=Cn2 对所有 n > = 1 n >=1 n>=1 成立,由此证得快速排序时间复杂度不超过 O( n 2 n^2 n2)。
2.2 平均时间复杂度

  设 T ( n ) T (n) T(n) 为输入规模为 n 时 QUICKSORT 算法的平均运行时间, T k ( n ) T_k(n) Tk(n)为所选划分元序号为 k+1 时 QUICKSORT 算法的平均运行时间,则 T ( n ) T (n) T(n) 满足以下递归方程:
T ( n ) = ∑ k = 0 n − 1 ( p ( k + 1 ) T k ( n ) ) T(n)=\sum_{k=0}^{n-1} (p(k+1)T_k(n)) T(n)=k=0n1(p(k+1)Tk(n))其中 p ( k + 1 ) p(k+1) p(k+1)为划分元素序号为 k + 1 k+1 k+1的概率,我们可以知道划分元素序号的概率是相同的故: p ( k + 1 ) = 1 n p(k+1)=\frac{1}{n} p(k+1)=n1,带入上式可得:
T ( n ) = ∑ k = 0 n − 1 1 n T k ( n ) ) = 1 n ∑ k = 0 n − 1 ( T ( k ) + T ( n − k − 1 ) + c n ) T(n)=\sum_{k=0}^{n-1} \frac{1}{n}T_k(n))= \frac{1}{n}\sum_{k=0}^{n-1} (T(k)+T(n-k-1)+cn) T(n)=k=0n1n1Tk(n))=n1k=0n1(T(k)+T(nk1)+cn)继续化简可得:
1 n ( ∑ k = 0 n − 1 T ( k ) + ∑ k = 0 n − 1 T ( n − k − 1 ) ) + c n = 2 n ∑ k = 0 n − 1 T ( k ) + c n \frac{1}{n}(\sum_{k=0}^{n-1} T(k)+\sum_{k=0}^{n-1}T(n-k-1))+cn=\frac{2}{n}\sum_{k=0}^{n-1}T(k)+cn n1(k=0n1T(k)+k=0n1T(nk1))+cn=n2k=0n1T(k)+cn解递归方程可得:
n T ( n ) = 2 ∑ k = 0 n − 1 T ( k ) + c n 2 nT(n)=2\sum_{k=0}^{n-1}T(k)+cn^2 nT(n)=2k=0n1T(k)+cn2 ( n − 1 ) T ( n − 1 ) = 2 ∑ k = 0 n − 1 T ( k ) + c n 2 (n-1)T(n-1)=2\sum_{k=0}^{n-1}T(k)+cn^2 (n1)T(n1)=2k=0n1T(k)+cn2两式相减,可得:
n T ( n ) − ( n − 1 ) T ( n − 1 ) = 2 T ( n − 1 ) + c ( 2 n − 1 ) nT(n)-(n-1)T(n-1)=2T(n-1)+c(2n-1) nT(n)(n1)T(n1)=2T(n1)+c(2n1) T ( n ) n + 1 < = T ( n − 1 ) n + 2 c n \frac{T(n)}{n+1}<=\frac{T(n-1)}{n}+\frac{2c}{n} n+1T(n)<=nT(n1)+n2c
G ( n ) = T ( n ) ( n + 1 ) G(n) = \frac{T(n)}{(n+1)} G(n)=(n+1)T(n)则有:
G ( n ) ≤ C ( n − 1 ) + 2 c n = G ( n − 2 ) + 2 c ( 1 n − 1 + 1 n ) = G ( n − 3 ) + 2 c ( 1 n − 2 + 1 n − 1 + 1 n ) = G ( n − k ) + 2 c ( 1 n − k + 1 + . . . + 1 n − 1 + 1 n ) \begin{aligned}G(n)& \leq C(n-1)+\frac{2c}{n}\\&=G(n-2)+2c(\frac{1}{n-1}+\frac{1}{n})\\&=G(n-3)+2c(\frac{1}{n-2}+\frac{1}{n-1}+\frac{1}{n})\\&=G(n-k)+2c(\frac{1}{n-k+1}+...+\frac{1}{n-1}+\frac{1}{n}) \end{aligned} G(n)C(n1)+n2c=G(n2)+2c(n11+n1)=G(n3)+2c(n21+n11+n1)=G(nk)+2c(nk+11+...+n11+n1)整理后得到: G ( 1 ) + 2 c ∑ k = 0 n − 2 1 n − k = 2 c ∑ k = 2 n 1 k < = 2 c ∗ H n < = 2 c l o g n G(1)+2c\sum_{k=0}^{n-2}\frac{1}{n-k}=2c\sum_{k=2}^{n}\frac{1}{k}<=2c*H_n<=2clogn G(1)+2ck=0n2nk1=2ck=2nk1<=2cHn<=2clogn
所以,Quicksort 算法的平均时间复杂度为: T ( n ) = G ( n ) ( n + 1 ) = θ ( n l o g n ) T(n)=G(n)(n+1)=\theta(nlogn) T(n)=G(n)(n+1)=θ(nlogn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1052129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开学教师自我介绍模版:打造个人品牌,轻松赢得学生喜爱

这里有一篇2000字左右的教师自我介绍长文&#xff1a; 亲爱的同学们&#xff0c;我是你们的XX老师。开学第一天&#xff0c;我非常高兴能在这里与大家见面。作为一名教师&#xff0c;我的职责是把知识教给你们&#xff0c;指导你们成长。同时&#xff0c;我也希望通过这次自我…

CocosCreator3.8研究笔记(二十三)CocosCreator 动画系统-动画编辑器相关功能面板说明

国庆假期&#xff0c;闲着没事&#xff0c;在家研究技术~ 上一篇&#xff0c;我们介绍了动画剪辑、动画组件以及基本的使用流程&#xff0c;感兴趣的朋友可以前往阅读&#xff1a; CocosCreator 动画系统-动画剪辑和动画组件介绍。 今天&#xff0c;主要介绍动画编辑器相关功能…

CocosCreator3.8研究笔记(二十二)CocosCreator 动画系统-动画剪辑和动画组件介绍

国庆假期&#xff0c;闲着没事&#xff0c;在家研究技术~ 大家都知道在Cocos Creator3.x 的版本的动画编辑器中&#xff0c;可以实现不用写一行代码就能实现各种动态效果。 Cocos Creator动画编辑器中主要实现关键帧动画&#xff0c;不仅支持位移、旋转、缩放、帧动画&#xff…

ASUS华硕天选4笔记本电脑FX507VV原厂Windows11系统

下载链接&#xff1a;https://pan.baidu.com/s/1W9tedHI3iFjaHju5eLkQ6g?pwd8dl2 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、华硕电脑管家、奥创控制中心等预装程序 由于时间关系,绝大部分资料没有上传&#xff0c;不是想要的型号&#xff0c;请联系客服获取。

Spring的注解开发-Bean基本注解开发

Bean基本注解开发 Spring除了xml配置文件进行配置之外&#xff0c;还可以使用注解方式进行配置&#xff0c;注解方式慢慢成为xml配置的替代方案。我们有了xml开发的经验&#xff0c;学习注解开发就会方便很多&#xff0c;注解开发更加快捷方便。Spring提供的注解有三个版本 2.…

【文献阅读】Pocket2Mol : 基于3D蛋白质口袋的高效分子采样 + CrossDocked数据集说明

Pocket2Mol: Efficient Molecular Sampling Based on 3D Protein Pockets code&#xff1a; GitHub - pengxingang/Pocket2Mol: Pocket2Mol: Efficient Molecular Sampling Based on 3D Protein Pockets 所用数据集 与“A 3D Generative Model for Structure-Based Drug Desi…

【网络原理】初始网络,了解概念

文章目录 1. 网络通信1.1 局域网LAN1.2 广域网WAN 2. 基础概念2.1 IP2.2 端口号 3. 认识协议4. 五元组5. 协议分层5.1 分层的作用5.2 OSI七层模型5.3 TCP/IP五层&#xff08;四层&#xff09;模型 6. 封装和分用 1. 网络通信 计算机与计算机之间是互相独立&#xff0c;是独立模…

天选之子Linux是如何发展起来的?为何对全球IT行业的影响如此之大?

天选之子Linux是如何发展起来的&#xff1f;为何对全球IT行业的影响如此之大&#xff1f; 前言一、UNIX发展史二、Linux发展历史三、开源四、官网五、 企业应用现状六、发行版本 前言 上面这副图是博主历时半小时完成的&#xff0c;给出了Linxu的一些发展背景。球球给位看官老…

Linux—进程间通信之System V共享内存

目录 简介System V共享内存特点及用法 共享内存的创建共享内存的关联与去关联共享内存的删除共享内存通信代码实现总结 简介 System V共享内存是一种在Unix-like系统中广泛使用的共享内存机制。它是基于System V IPC&#xff08;Inter-Process Communication&#xff0c;进程间…

2023.09.30使用golang1.18编译Hel10-Web/Databasetools的windows版

#Go 1.21新增的 log/slog 完美解决了以上问题&#xff0c;并且带来了很多其他很实用的特性。 本次编译不使用log/slog 包 su - echo $GOPATH ;echo $GOROOT; cd /tmp; busybox wget --no-check-certificate https://go.dev/dl/go1.18.linux-amd64.tar.gz;\ which tar&&am…

【腾讯云 TDSQL-C Serverless 产品体验】国产数据库遥遥领先

一、为什么选TDSQL-C 1、性能达到每分钟8.14亿笔交易 国产数据库傲立世界之巅&#xff01;腾讯云数据库TDSQL-C性能刷新世界记录。 由TPC发起的TPC-C是针对在线事务处理(OLTP)的基准测试模型&#xff0c;是全球数据库厂商公认的性能评价标准&#xff0c;被誉为数据库领域的“…

解决WIFI网络登录困难的方法

当你遇到手机WIFI网络在连接成功后&#xff0c;总是提示网络受限或者当前网络无法连接互联网&#xff0c;但过一段时间后它又自动恢复正常的的问题&#xff0c;可以尝试用以下方法来解决。 第一步&#xff1a;打开WLAN连接设置界面&#xff0c;选择“更多设置” 第二步&#x…

关于TUM数据集

2、验证回环检测算法&#xff0c;需要有人工标记回环的数据集。然而人工标记回环是很不方便的&#xff0c;我们会考虑根据标准轨迹计算回环。即&#xff0c;如果轨迹中有两个帧的位姿非常相近&#xff0c;就认为它们是回环。请根据TUM数据集给出的标准轨迹&#xff0c;计算出一…

Flink中的状态一致性

1.概念 一致性其实就是结果的正确性。对于分布式系统而言&#xff0c;从不同节点读取时总能得到相同的值&#xff1b;而对于事务而言&#xff0c;是要求提交更新操作后&#xff0c;能够读取到新的数据。 有状态的流处理&#xff0c;内部每个算子任务都可以有自己的状态。对于流…

域环境介绍

一、概述 内网也指局域网&#xff0c;指的是某个区域由多台计算机互连而成的计算机组&#xff0c;范围通常在数千米以内&#xff0c;在局域网中&#xff0c;可以实现文件管理&#xff0c;应用软件共享&#xff0c;打印机共享、工作组内的日程安排、电子邮件和传真通信服务等&a…

【微服务保护】

文章目录 Sentinel 微服务雪崩问题&#xff1a; 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。服务D有 故障进而导致服务A有故障&#xff0c;进而导致服务雪崩。 解决雪崩问题的常见方式有四种&#xff1a; 超时处理&#xff1…

iPhone苹果手机复制粘贴内容提示弹窗如何取消关闭提醒?

经常使用草柴APP查询淘宝、天猫、京东商品优惠券拿购物返利的iPhone苹果手机用户&#xff0c;复制商品链接后打开草柴APP粘贴商品链接查券时总是弹窗提示粘贴内容&#xff0c;为此很多苹果iPhone手机用户联系客服询问如何关闭iPhone苹果手机复制粘贴内容弹窗提醒功能的方法如下…

毛玻璃态按钮悬停效果

效果展示 页面结构组成 通过上述的效果展示可以看出如下几个效果 毛玻璃的按钮按钮上斜边背景及动画按钮上下边缘的小按钮和小按钮动画 CSS3 知识点 backdrop-filter 属性transition 属性transform 属性 实现基础按钮结构 <div class"btn"><a href&qu…

第三章 C运算符和控制语句

几乎每一个程序都需要进行运算&#xff0c;对数据进行加工处理&#xff0c;否则程序就没有意义了。要进行运算&#xff0c;就需规定可以使用的运算符。 C语言的运算符范围很宽&#xff0c;把除了控制语句和输人输出以外的几乎所有的基本操作都作为运算符处理。 运算符分类1 除…