04-快速排序

数据结构和算法
基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏

第4章 快速排序

4.1 分而治之
divide and conquer , 简称D&C:一种著名的递归式问题解决方法。

例子1:

假设你是农场主,有一小块土地。要求将这块地均匀地分成方块,且分出的方块要尽可能大。

使用D&C解决问题的过程包括两个步骤:

(1)找出基线条件,这种条件必须尽可能简单。
(2)不断将问题分解(或者说缩小规模),直到复合基线条件。

在分土地问题中,我们设定基线条件为:一条边的长度是另一条边的整数倍。
在这里插入图片描述

根据D&C的定义,每次递归调用都必须缩小问题的规模。因此,我们首先找出这块可容纳的最大方块。
在这里插入图片描述

可以将这块地划出连个640m×640m的方块。

余下一块640m×400m的土地
在这里插入图片描述
在这里插入图片描述

按照上述方法继续划分;
最终得出对于最初的那块土地,适用的最大方块为80m×80m。
也就是说,适用于小块地的最大方块,也是适用于整块地的最大方块。
在这里插入图片描述

例子2:
重申D&C工作原理:

(1)找出简单的基线条件。
(2)确定如何缩小问题的规模,使其符合基线条件。
注意:D&C并非可用于解决问题的算法,而是一种解决问题的思路。
在这里插入图片描述

练习:

4.1 请编写前述sum函数的代码。
4.2 编写一个递归函数来计算列表包含的元素数。
4.3 找出列表最大的数字。
4.4 找出二分查找算法的基线条件和递归条件。

4.2 快速排序
使用D&C的排序算法:需要将数组分解,直到满足基线条件。
工作原理:从数组中选择一个元素,作为基准值(pivot)。
基线条件:数组为空或只包含一个元素。(因为这种情况下,只需要返回数组——不需要排序)。
在这里插入图片描述

假设一个包含三个元素的数组:
在这里插入图片描述

首先确定元素15用作基准值。
在这里插入图片描述

对包含三个元素的数组进行排序的步骤:

  1. 选择合适的基准值。
  2. 将数组分成两个子数组:小于基准值的元素组成的子数组和大于基准值的元素组成的子数组。
  3. 对这两个子数组进行排序。
  4. 最后合并为一个有序数组:小于基准值子数组+基准值+大于基准值子数组。

那么,对于包含四个、五个…的数组呢?
同样,选择一个合适的基准,进行分区,每个区对其递归地调用快速排序。

#快速排序代码
def quicksort(array):if len(array) < 2#基线条件return array else:pivot = array[0] #选择基准值less = [i for i in array[1:] if i <= pivot] #小于基准值子数组。greater = [i for i in array[1:] if i > pivot] #大于基准值子数组。return quicksort(less) + pivot + quick(greater)
print quicksort([10,5,2,3]) 

4.3 再谈大O表示法
快速排序的独特之处在于,其速度取决于选择的基准值。

几种常见的大O运行时间:(横坐标为次数,纵坐标为时间)
在这里插入图片描述

4.3.1 常量的影响
在这里插入图片描述

  • 对于大O运行时间相同的两种算法影响大,比如合并排序和快速排序,运行时间都为O(n log n),快速排序更快。
  • 对于大O运行时间不同的两种算法影响则忽略不计,这种常量将无关紧要。

4.3.2 平均情况和最糟情况
快速排序的性能高度依赖于你选择的基准值。

假设总是以第一个元素用作基准值:
在这里插入图片描述

实际上数组并没有被分成两半,其中一个子数组始终为空,实在是一种浪费,导致调用栈达到最大长度,栈高也就是层数为O(n)。

假设总是将中间元素用作基准值:
在这里插入图片描述

调用栈直接减半,栈高也就是层数为O(n log n),因为每次都将数组分成两半,不需要那么多递归调用,很快就达到了基线条件。

在调用栈的每一层都涉及O(n)个元素,因此,完成每层所需的时间都为O(n):

最佳情况:调用栈高度为O(log n),每层需要的时间为O(n);因此整个算法需要的时间为:O(n)*O(log n)=O(n log n)。
最糟情况:调用栈高度为O(n),每层所需时间为O(n);整个时间为:O(n²)。

最佳情况也是平均情况,快速排序时最快的排序算法之一,也是D&C典范。

练习:

4.5 打印数组中每个元素的值。
4.6 将数组中每个元素的值都乘以2。
4.7 只将数组中第一个元素的值乘以2。
4.8 根据数组包含的元素创建一个乘法表,即如果数组为[2,3,7,8,10],首先将每个元素都乘以2,再将每个元素都乘以3,然后每个元素都乘以7,以此类推。

4.4 小结

  • D&C将问题逐步分解。编写涉及数组的递归函数时,基线条件通常是数组为空或只包含一个元素。
  • 实现快速排序时,请随机地选择用作基准值的元素。快速排序的平均运行时间为O(n log n)。
  • 比较二分查找和简单查找时,常量几乎无关紧要,因为列表很长时,O(log n)的速度比O(n)快很多。

——持续修改完善中…

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

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

相关文章

android studio no marked region found along edge Found along top edge

由于种种原因&#xff0c;导致9图已经不是9图格式了&#xff0c;但是在Eclipse里面不会报错&#xff0c;在android studio 里面会报错 Error:9-patch image D:\download\avatar-android-master\avatar-android-master\sample\src\main\res\drawable-hdpi\abc_list_divider_holo…

Linux下安装compsoer ,并使用composer安装laravel

为什么80%的码农都做不了架构师&#xff1f;>>> 1、composer安装 https://getcomposer.org/download/打开composer官网。根据提示linux下可以使用php安装。 php -r "copy(https://getcomposer.org/installer, composer-setup.php);" php -r "if (ha…

AspNetCore在docker部署时遇到一个小坑

哦吼之前刚说了尝试了使用docker来部署AspNetCore应用&#xff08;Asp.Net Core部署&#xff1a;早知道&#xff0c;还是docker!以及一点碎碎念&#xff09;&#xff0c;结果这才刚上班就遇到问题了 …我这项目用的数据库是Oracle&#xff0c;之前直接运行没啥问题&#xff0c;…

05-散列表

数据结构和算法 基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏 第5章 散列表 假设你在一家杂货店上班。有顾客来买东西时&#xff0c;你得到一个本子中查找价格。如果本子的内容不是按字母顺序来排序的&#xff0c;你可能为查找苹果价格而浏览每一页&#xff0c…

疯狂ios讲义疯狂连载之实现游戏逻辑(2)

13.6.5 定义获取通道的工具方法这里所谓的通道指的是一个方块上、下、左、右4个方向上的空白方块图13.10显示了一个方块四周的通道。图13.10 方块四周的通道下面是获取某个坐标点四周通道的4个方法。程序清单codes/13/Link/Link/sources/board/FKGameService.m13.6.6 没有转折点…

linux之进程间通信--使用信号

一、什么是信号用过Windows的我们都知道&#xff0c;当我们无法正常结束一个程序时&#xff0c;可以用任务管理器强制结束这个进程&#xff0c;但这其实是怎么实现的呢&#xff1f;同样的功能在Linux上是通过生成信号和捕获信号来实现的&#xff0c;运行中的进程捕获到这个信号…

解决Maven工程中报 Missing artifact jdk.tools:jdk.tools

2019独角兽企业重金招聘Python工程师标准>>> 解决方法&#xff1a; 在pom.xml中添加如下依赖&#xff1a; <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>…

回到地球之后,这个男人创建了Ubuntu

文 | 大东出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;2002 年&#xff0c;莫斯科当地时间 4 月 25 日 9 时 26 分&#xff0c;满载着补给和 3 名宇航员的“联盟-TM 号”航天飞船在“联盟 U”火箭的推进下飞往国际空间站。同行的三人中&#xff0c;年…

Hadoop完全分子式环境搭建—问题及解决办法

Hadoop完全分布式环境搭建 ps:本人是按照尚硅谷的教程搭建的&#xff0c;版本hadoop2.7&#xff0c;centos版本6&#xff0c;一台主机&#xff0c;两台从机。 一&#xff0e;版本问题 1.尽量使用hadoop版本2&#xff0c;尽量不要使用最新版本3。因为会出现无法解决的问题&…

POJ 2135 最小费用最大流

思路&#xff1a; 源->1连费用0 流量2 其它的边 费用w 流量1 n->汇 费用0 流量2 最小费用流 搞定~ //By SiriusRen #include <queue> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 2010 #def…

06-广度优先搜索:图、队列

数据结构和算法 基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏 第6章广度优先搜索 6.1 简介 广度优先搜索—breadth-first search&#xff0c;BFS. 主要内容图和队列。 广度优先搜索能让你能够找出两样东西之间的最短距离&#xff0c;比如&#xff1a;编写国际跳…

虎年云原生落地技术趋势

今天是立春&#xff0c;虎年第一天。去年我写过一篇 牛年 dotnet云原生技术趋势[1]&#xff0c;今天再来写一篇虎年云原生落地技术趋势&#xff0c;去年局限在.NET 平台上的云原生落地&#xff0c;我今年在去年探索云原生落地的基础上从多语言云原生技术落地的趋势来谈谈。在 2…

WdatePicker 设置日期第一个比第二个的日期小

WdatePicker 设置日期第一个比第二个的日期小 可以设置&#xff0c;日期只显示某一天的&#xff0c;比如只显示周一&#xff0c;和周日 <input id"Text1" class"Wdate" onFocus"WdatePicker({disabledDays:[0,2,3,4,5,6],maxDate:#F{$dp.$D(\Text2…

07-狄克斯特拉算法

数据结构和算法 基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏 第7章 狄克斯特拉算法 上一章的广度优先搜索&#xff0c;找出的是段数最少的路径&#xff1b; 本章狄克斯特拉算法&#xff0c;找出的是最快的路径。 7.1 使用狄克斯特拉算法 步骤&#xff1a; 第…

聊聊mysql执行过程

在项目开发当中 &#xff0c;很多时候&#xff0c;我们的数据库应用优化都是从表层到里层的一个过程。比如一个查询写下来 &#xff0c;我们的优化方向大多时候都是先看方法执行的时间长短&#xff0c;然后再决定是否去优化它&#xff0c;下意识的第一步操作都是看是否命中索引…

01. Node js Hello world

2019独角兽企业重金招聘Python工程师标准>>> 01. Node js Hello world 环境安装 官网http://nodejs.org/ Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, no…

异常检测之浅谈入侵检测

打开微信扫一扫&#xff0c;关注微信公众号【数据与算法联盟】 转载请注明出处&#xff1a;http://blog.csdn.net/gamer_gyt 博主微博&#xff1a;http://weibo.com/234654758 Github&#xff1a;https://github.com/thinkgamer前言 由于业务关系&#xff0c;最近一段时间一直在…

企业知识库在跨地域团队协作中的价值

随着全球化进程的不断加速&#xff0c;越来越多的企业开始面临跨地域协作的挑战。在这种背景下&#xff0c;企业知识库作为一种重要的知识管理工具&#xff0c;对于提高团队协作效率、促进知识共享与创新具有不可替代的价值。接下来就说一下知识库在跨地域团队协作中的重要性及…

Asp-Net-Core开发笔记:接口返回json对象出现套娃递归问题

前言看了下推送记录&#xff0c;一个月前&#xff0c;OK&#xff0c;我又变成月更了o(╯□╰)o&#xff0c;这绝对不行&#xff01;[○&#xff65;&#xff40;Д&#xff65; ○]所以今天来更新了其实不是我懒得更新或者是太忙&#xff0c;其实是最近在写一篇很长的博客&…

spring之二——使用maven创建一个java project

2019独角兽企业重金招聘Python工程师标准>>> maven的安装及Eclipse maven插件安装这里不再说了&#xff0c;安装可以看这篇博客&#xff1a; http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html 需要注意的是&#xff0c;maven在w…