算法之旅 | 快速排序法

HTML5学堂-码匠:前几期“算法之旅”跟大家分享了冒泡排序法和选择排序法,它们都属于时间复杂度为O(n^2)的“慢”排序。今天跟大家分享多种排序算法里使用较广泛,速度快的排序算法
—— 快速排序法 [ 平均时间复杂度为O (n logn) ]。

Tips 1:关于“算法”及“排序”的基础知识,在此前“选择排序法”中已详细讲解,可点击文后的相关文章链接查看,在此不再赘述。
Tips 2:如果无特殊说明,本文的快速排序是从小到大的排序。

快速排序法的原理

快速排序是一种划分交换排序,它采用分治的策略,通常称其为分治法

分治法

基本思想:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解决这些子问题,然后将这些子问题的结果组合成原问题的结果。

基本原理

从序列中任选一个数作为“基准”;
所有小于“基准”的数,都挪到“基准”的左边;所有大于等于“基准”的数,都挪到“基准”的右边;
在这次移动结束之后,该“基准”就处于两个序列的中间位置,不再参与后续的排序;
针对“基准”左边和右边的两个子序列,不断重复上述步骤,直到所有子序列只剩下一个数为止。

原理图解

现有一个序列为 [8, 4, 7, 2, 0, 3, 1],如下演示快速排序法如何对其进行排序。

clipboard.png

实现快速排序的步骤分解

选择“基准”,并将其从原始数组分离

先获取基准的索引值,再使用splice数组方法取出基准值。

clipboard.png

Tips:该实例中, 基准的索引值 = parseInt(序列长度 / 2)
Tips:splice方法会改变原始数组。例如,arr = [1, 2, 3]; 基准索引值为1,基准值为2,原始数组变为arr = [1, 3];

遍历序列,拆分序列

与“基准”比较大小,并拆分为两个子序列
小于“基准”的数存储于leftArr数组当中,大于等于“基准”的数存储于rightArr数组当中

clipboard.png

Tips:当然,也可以将 小于等于“基准”的数存于leftArr,大于“基准”的数存于rightArr
由于要遍历序列,将每一个数与“基准”进行大小比较,所以,需要借助for语句来实现

clipboard.png

递归调用,遍历子序列并组合子序列的结果

定义一个函数,形参用于接收数组

function quickSort(arr) { };

实现递归调用遍历子序列,用concat数组方法组合子序列的结果

clipboard.png

判断子序列的长度

递归调用的过程中,子序列的长度等于1时,则停止递归调用,返回当前数组。

clipboard.png

快速排序法完整代码

clipboard.png

快速排序法的效率

时间复杂度

最坏情况:每一次选取的“基准”都是序列中最小的数/最大的数,这种情况与冒泡排序法类似(每一次只能确定一个数[基准数]的顺序),时间复杂度为O(n^2)
最好情况:每一次选取的“基准”都是序列中最中间的一个数(是中位数,而不是位置上的中间),那么每次都把当前序列划分成了长度相等的两个子序列。这时候,第一次就有n/2、n/2两个子序列,第二次就有n/4、n/4、n/4、n/4四个子序列,依此类推,n个数一共需要logn次才能排序完成(2^x=n,x=logn),然后每次都是n的复杂度,时间复杂度为O(n logn)

空间复杂度

最坏情况:需要进行n‐1 次递归调用,其空间复杂度为 O(n)
最好情况:需要logn次递归调用,其空间复杂度为O(logn)

算法的稳定性

快速排序是一种不稳定排序算法
例如:现有序列为[1, 0, 1, 3],“基准”数字选择为第二个1
在第一轮比较之后,变成了[0, 1, 1, 3],左序列为[0],右序列为[1, 3](右序列的1是此前的第一个1)
不难发现,原序列的两个1的先后顺序被破坏了,改变了先后顺序,自然就是“不稳定”的排序算法了

关于O

在此前的“冒泡排序法”一文当中,我们详细讲解过O是什么,在此就不多说了,直接上图吧

clipboard.png

相关文章链接

算法之旅 | 选择排序法
算法之旅 | 冒泡排序法

开开心心每一天

生活艰辛,代码不易,但,不要忘记微笑!

clipboard.png


图片描述

clipboard.png

clipboard.png

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

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

相关文章

springmvd接收参数问题

问题描述: 好久不写博客了,今天遇到一个问题,那就是post请求时,参数接收不到,当时我很纳闷,看代码: 就是这样几个参数,我使用postman请求时无法获取参数: 报错信息&#…

figma下载_如何在Figma中创建逼真的3D对象

figma下载by Gbolahan Taoheed Fawale通过Gbolahan Taoheed Fawale 如何在Figma中创建逼真的3D对象 (How to create realistic 3D objects in Figma) Prior to using Figma, I used Adobe Illustrator for most of my designs (like logos, mockups, illustrations, and so on…

OpenGL中的二维编程——从简单的矩形开始

一、OpenGL的组成 图元函数(primitive function)指定要生成屏幕图像的图元。包括两种类型:可以在二维、三维或者四维空间进行定义的几何图元,如多边形;离散实体;位图。属性函数(attribute funct…

圆与平面的接触面积_如果一个绝对的圆放在绝对的平面上,接触面是不是无限小?...

这种问题其实并不难解答:如果你真的能找到一个绝对的圆还有一个绝对平的平面上,并且保证放上去之后圆和平面不会有任何变化,那么接触面就可以是无限小!如果不能,很抱歉,接触面很显然就不会是无限小&#xf…

leetocde1129. 颜色交替的最短路径(bfs)

在一个有向图中,节点分别标记为 0, 1, …, n-1。这个图中的每条边不是红色就是蓝色,且存在自环或平行边。 red_edges 中的每一个 [i, j] 对表示从节点 i 到节点 j 的红色有向边。类似地,blue_edges 中的每一个 [i, j] 对表示从节点 i 到节点…

第38天:运算符、字符串对象常用方法

一、运算符 一元操作符 &#xff0c; --&#xff0c; &#xff0c; - 5 -6 逻辑操作符 !&#xff0c; &&&#xff0c; || 基本运算符 , -, *, /, % 关系操作符 >, <, >, <, , , !, ! 赋值 判断 全等 条件操作符 &#xff08;三…

Redux Todos Example

此项目模板是使用Create React App构建的&#xff0c;它提供了一种简单的方法来启动React项目而无需构建配置。 使用Create-React-App构建的项目包括对ES6语法的支持&#xff0c;以及几种非官方/尚未最终形式的Javascript语法 先看效果 这个例子可以帮助你深入理解在 Redux 中 …

有效电子邮件地址大全_如何优雅有效地处理介绍电子邮件

有效电子邮件地址大全by DJ Chung由DJ Chung 如何优雅有效地处理介绍电子邮件 (How to handle intro emails gracefully and effectively) 您想帮个忙时不想忘恩负义... (You don’t want to sound ungrateful when asking for a favor…) Let me tell you the story that ins…

notability录音定位_Notability的一些使用技巧?

作为使用了一年Notability的考研狗 今天也来回答回答这个问题&#xff0c;希望可以给考研的同学一点点帮助。这个软件的优点估计大家都知道&#xff0c;我在这里就不多说了。好吧&#xff0c;还有一个原因是我比较懒&#xff01;好了不多说废话了&#xff0c;等会你们要打我了本…

python实现软件的注册功能(机器码+注册码机制)

sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 一、前言&#xff1a;目的&#xff1a;完成已有python图像处理工具的注册功能功能&am…

leetcode1306. 跳跃游戏 III(bfs)

这里有一个非负整数数组 arr&#xff0c;你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时&#xff0c;你可以跳到 i arr[i] 或者 i - arr[i]。 请你判断自己是否能够跳到对应元素值为 0 的 任一 下标处。 注意&#xff0c;不管是什么情况下&#xff0c;你都无法…

Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

原文:Win10 UWP开发系列&#xff1a;使用VS2015 Update2ionic开发第一个Cordova App安装VS2015 Update2的过程是非常曲折的。还好经过不懈的努力&#xff0c;终于折腾成功了。 如果开发Cordova项目的话&#xff0c;推荐大家用一下ionic这个框架&#xff0c;效果还不错。对于Cor…

vavr_使用Vavr在Java 8流中更好的异常处理

vavrby Rajasekar Elango由Rajasekar Elango In this post, I will provide tips for better exception handling in Java 8 streams using the Functional Java library Vavr.在这篇文章中&#xff0c;我将提供使用Functional Java库Vavr在Java 8流中更好地处理异常的技巧。 …

Python-strace命令追踪ssh操作

Python-strace命令追踪ssh操作 通过strace 命令追踪ssh的进程ID&#xff0c;记录操作的命令[实际上是内核里面记录的东西]&#xff0c;进行操作日志的Py解析达到效果 追踪进程并写入ssh操作到文件中 Ps: 此时机器A已经ssh登录了机器B&#xff0c;取得它的ssh进程PID 机器A登录后…

java h2 derby_嵌入式H2数据库的Spring配置以进行测试

小编典典由于我不知道是否有任何工具可以检查数据库&#xff0c;我认为一个简单的解决方案是使用支持HSQL&#xff0c;H2和Derby 的Spring嵌入式数据库(3.1.x docs&#xff0c;current docs)。 。使用H2&#xff0c;你的xml配置如下所示&#xff1a;如果你更喜欢基于Java的配置…

基础的python程序_Python程序入门

Python语法元素入门Python语法元素分析注释注释&#xff1a;程序员在代码中加入的说明信息&#xff0c;不被计算机执行注释的两种方法&#xff1a;单行注释以#开头多行注释以开头和结尾# Here are the commentsThis is a multiline commerntused in Python缩进1个缩进 &#xf…

解决阿里云服务器磁盘报警

一般磁盘报警涉及到实际磁盘和inode文件索引节点 1.df -h检查磁盘占用不高 2.df -i检查inode文件索引节点有一个挂载目录达到89%,里面有一个目录产生大量的4k大的缓存文件,删除该目录下的文件解决: 删除该目录下小于4kb的文件 find /data/tmp -type f -size -4 -exec rm -rf {}…

leetcode310. 最小高度树(bfs)

对于一个具有树特征的无向图&#xff0c;我们可选择任何一个节点作为根。图因此可以成为树&#xff0c;在所有可能的树中&#xff0c;具有最小高度的树被称为最小高度树。给出这样的一个图&#xff0c;写出一个函数找到所有的最小高度树并返回他们的根节点。格式该图包含 n 个节…

如何构建自己的免费无服务器评论框

by Shaun Persad通过Shaun Persad 如何构建自己的免费无服务器评论框 (How you can build your own free, serverless comment box) Contentful’s flexible content modeling goes far beyond blog posts. Here’s how you can leverage Contentful and Netlify to create a …

[Swift]LeetCode1035.不相交的线 | Uncrossed Lines

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…