【算法设计与分析】16 分治策略:快速排序(快速排序的时间复杂度计算)

上一篇文章学习了:【算法设计与分析】15 分治策略:芯片测试

文章目录

    • 1. 快速排序的基本思想
      • 1.2 时间复杂度的计算
        • 1.21 最坏情况时间复杂度计算
        • 1.22 最好情况时间复杂度
        • 1.23 平均时间复杂度计算
    • 2 总结

1. 快速排序的基本思想

  • 用首元素 x 作划分标准,将输入数 组 A划分成不超过 x 的元素构成的数 组 AL,大于 x 的元素构成的数组 AR. 其中 AL, AR从左到右存放在数组 A 的位置.
  • 递归地对子问题 AL和 AR 进行排序, 直到子问题规模为 1 时停止.

下面两张图是它的伪代码表示:
在这里插入图片描述
划分的过程为:
在这里插入图片描述

以下是划分的例子:
在这里插入图片描述

1.2 时间复杂度的计算

1.21 最坏情况时间复杂度计算

最坏情况:

  • W(n) = W(n-1)+n-1
  • W(1) = 0

得出:

  • W(n) = n(n-1)/2

在最坏情况下,有一种可能为:每次划分,首元素依然是在首元素,它是最小的(或者是最大的),下次划分也是同样的结果。这种情况下,是最坏的情况。子问题永远比上一个原问题只少了一个元素。并且每次都需要对n-1个元素进行遍历比较。

由上面的结果看出最坏的情况的时间复杂度是O(n2)

1.22 最好情况时间复杂度

最好情况下,就是每一次划分,AL 与AR 总是均衡的在两边,首元素最终落到中间。那么子问题就变成了原问题的一半的元素数量(但是有两个子问题)。

  • T(n) = 2 T(n/2)+n-1
  • T(1) = 0

得出:
T(n)=Θ(nlogn)T(n) = \Theta (nlogn)T(n)=Θ(nlogn)

以上两种时间复杂度是最好和最坏的情况下。那么均衡额时间复杂度如何计算呢?

在计算均衡时间复杂度之前先来看看划分之后AL 与 AR 的比例是固定时的时间复杂度是多少?

例如子问题的规模比是1:9时,那么有:

  • T(n) = T(n/10) + T(9n/10) + n
  • T(1) = 0

根据递归树,时间复杂度为:

  • T(n)=Θ(nlogn)T(n) = \Theta (nlog n)T(n)=Θ(nlogn)

注释,上面的递归树计算如下:
在这里插入图片描述

1.23 平均时间复杂度计算

那么平均时间复杂度计算如下:

首元素最后落在的位置,可能在1,2,3…n

假设情况的概率均为1/n,那么各个情况下,子问题的计算规模如下:

  • 首元素在位置 1: T(0), T(n-1)
  • 首元素在位置 2: T(1), T(n-2)

  • 首元素在位置 n-1: T(n-2), T(1)
  • 首元素在位置 n: T(n-1), T(0)

那么子问题的工作量一共为:2[T(1)+T(2)+…+T(n-1)]

划分工作量 n-1

那么平均情况下时间复杂度计算公式为:

在这里插入图片描述

首元素划分后每个位置概率相等

2 总结

快速排序一般人都能写出来,但是要理解它的时间复杂度计算,恐怕并不是一般人都会计算,我们要追根问底。

快速排序算法
• 分治策略
• 子问题划分是由首元素决定 • 最坏情况下时间O(n2)
• 平均情况下时间为O(nlogn)

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

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

相关文章

的run窗口不显示_「玩转deepin」如何安装VirtualBox增强功能使得deepin全屏显示?...

在Windows上通过Virtualbox安装deepin深度操作系统,安装完成后,为了让deepin可以在virtualbox中全屏显示,需要安装增强工具,但是不少同学点击安装增强工具后会出现无法安装的情况。在【设备】中点击【安装增强功能】时&#xff0c…

掘金浏览器插件安装图文教程

本文介绍如何安装掘金chrome插件: Chrome插件推荐 2018-02-27 21:53 chrome插件网近日推荐一款设计师开发人员人手必备的一款插件:掘金插件。有网友留言给笔者说希望整理出一套掘金插件详细的安装步骤。于是就有了今天的图文详解掘金插件安装步骤。第一…

python集群到hadoop_如何使用Hadoop流在本地Hadoop集群中运行MRJob?

我正在学习一个大数据类,我的一个项目是在本地建立的Hadoop集群上运行Mapper/Reducer。在我一直在为类使用Python和MRJob库。在下面是我当前用于Mapper/Reducer的Python代码。在from mrjob.job import MRJobfrom mrjob.step import MRStepimport reimport osWORD_RE…

【ThinkPHP】实例化模型的方法

欢迎大家访问我自己架的博客站点 码厩技术博客! 1、实例化一个Model function D($name, $app) { static $_model array(); if (empty($name)) return new Model; if (empty($app)) $app C(DEFAULT_APP); if (isset($_model[$app . $name])) return $_model[$app .…

【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的

文章目录1 一条SQL查询语句是如何执行的2 mysql体系结构3 InnoDB存储引擎4 总结1 一条SQL查询语句是如何执行的 ​ 通常我们使用数据库,都是将数据库看成一个整体,我们的应用与数据库完全就是通过SQL语句进行交互。大多数开发者很少去了解数据库的内部实…

session实现机制_如何理解php session运行机制

php session运行机制就是客户端将session id传入到服务器中,服务器再根据session id找到对应的文件并将其反序列化得到session值,然后保存的时候先序列化再写入今天将要分享的知识点是PHP中的会话运行机制,对于熟悉PHP的开发者来说并不陌生&a…

【MySQL原理解析】01. 一条SQL查询语句是如何执行的

这是【MySQL原理解析】的第一篇文章,MySQL我看了很多的书与教程,对其原理有一定的理解,一直想写一系列的文章来把MySQL的原理给讲清楚,一直没有时间写,今天算是个开头吧。万事开头难,咱们先破了这个开头&am…

【转载】MOS开关(verilog)

MOS开关 一. MOS开关 1. NMOS 源极(d)接Gnd 一般情况下,可认为晶体管受栅极(g)电平VG的控制(control). 1). VGH,源极(s)与漏极(d)接通; 2). VGL,源极(s)与漏极(d)断开. 源极(s)与漏极(d)接通, 则漏极(d)被下拉到Gnd. 2. PMOS 源极(d)接VDD 1)…

【Linux进程、线程、任务调度】二 fork/vfork与写时拷贝 线程的本质 托孤 进程睡眠和等待队列

学习交流加(可免费帮忙下载CSDN资源):个人微信: liu1126137994学习交流资源分享qq群1(已满): 962535112学习交流资源分享qq群2(已满): 780902027学习交流资源…

用Log4Net来记录系统的日志信息

[http://www.cnblogs.com/xhwy/archive/2011/11/25/2263495.html] 几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。 经验表明…

扩展插件_Adobe扩展工具插件系列

Adobe系列软件相信大家都已了解到其功能的强大,除了软件之外Adobe系列的插件的功能也是不可忽略的。今天给大家分享的几款Adobe系列超强PS扩展工具,都是一些摄影师、设计师经常用的到的,可以提升不少工作效率,大家千万别错过哦&am…

【Linux进程、线程、任务调度】三 CPU/IO消耗型进程 吞吐率/响应 SCHED_FIFO算法与SCHED_RR算法 SCHED_NORMAL算法和CFS算法 nice与renic chrt

学习交流加(可免费帮忙下载CSDN资源):个人微信: liu1126137994学习交流资源分享qq群1(已满): 962535112学习交流资源分享qq群2(已满): 780902027学习交流资源…

dexpress 流程图_DevExpress控件使用经验总结

DevExpress是一个比较有名的界面控件套件,提供了一系列的界面控件套件的DotNet界面控件。本文主要介绍我在使用DevExpress控件过程中,遇到或者发现的一些问题解决方案,或者也可以所示一些小的经验总结。总体来讲,使用DevExpress控…

UCenter 表结构

Ucenter 数据库表结构说明uc_admins 管理员表数据表说明:管理员相关信息属性说明:uid mediumint(8) -- 用户IDusername char(15) -- 用户名allowadminsetting tinyint(1) --allowadminapp tinyint(1) --allowadminuser tinyint(1) --allowadminbadword t…

Java学习之路整理-技术书从入门到进阶最全50+本(珍藏版 )

学习交流加 个人微信:LyyCoder学习交流资源分享qq群1(已满): 962535112学习交流资源分享qq群2: 780902027一.速读一遍(最好在1~2天内完成) 人的大脑记忆力有限,在一天内快速看完一本…

问题 seata_架构设计 | 基于Seata中间件,微服务模式下事务管理

一、Seata简介1、Seata组件Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA、XA事务模式,为用户打造一站式的分布式解决方案。2、支持模式AT 模式基于支持本地 ACID 事务的关系型数…

Override and Overload (重写和重载)

1)方法的重写overriding和重载overloading是java多态性的不同表现. (2)重写overriding是父类与子类之间的多态性的一种表现,重载是一个类中多态性的表现。如果子类中定义方法与其父类有相同的名称和参数,我们说该方法被…

程序员史诗级必读书单吐血整理四个维度系列80+本书(珍藏版)

互联网行业的特点是变化。若要提高互联网开发的技能,就必须跟上技术发展的步伐。埋首醉心于项目开发与实战,固然能够锤炼自己的开发技巧,却难免受限于经验与学识。 世界上并不存在速成的终南捷径,但阅读好的技术书籍,尤…

示波器1m和50欧姆示阻抗匹配_示波器输入阻抗选1MΩ还是50Ω的详细解析

熟悉示波器的朋友可能都会有过这样的困惑:输入阻抗有1MΩ和50Ω两种,我们到底该如何选择呢?一、传输线想要讲清楚50Ω的由来,我们需要先讲一下传输线。电信号实际上是以电磁波的形式在传输线中传播的。当传输线的尺寸不再远小于电…

前端学习(355):小练习

.已知两个矩形,宽高分别是200200,400400,甲矩形的坐标是x1,y1.乙矩形的坐标是x2,y2. 写出判断条件两个矩形是否相碰撞 <script>x1200;//自己随意定义坐标x2200;y1400;y2400;var boolfalse;//先定义一个布尔值为falseif(x1>x2 && x1<x2400 && y1&g…