前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >算法之旅 | 快速排序法

算法之旅 | 快速排序法

作者头像
HTML5学堂
发布于 2018-03-13 08:47:19
发布于 2018-03-13 08:47:19
8702
举报
文章被收录于专栏:HTML5学堂HTML5学堂
HTML5学堂-码匠:前几期“算法之旅”跟大家分享了冒泡排序法和选择排序法,它们都属于时间复杂度为O(n^2)的“慢”排序。今天跟大家分享多种排序算法里使用较广泛,速度快的排序算法 —— 快速排序法 [ 平均时间复杂度为O (n logn) ]。

Tips 1:关于“算法”及“排序”的基础知识,在此前“选择排序法”中已详细讲解,可点击文后的相关文章链接查看,在此不再赘述。

Tips 2:如果无特殊说明,本文的快速排序是从小到大的排序。

快速排序法的原理

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

分治法

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

基本原理

从序列中任选一个数作为“基准”;

所有小于“基准”的数,都挪到“基准”的左边;所有大于等于“基准”的数,都挪到“基准”的右边;

在这次移动结束之后,该“基准”就处于两个序列的中间位置,不再参与后续的排序;

针对“基准”左边和右边的两个子序列,不断重复上述步骤,直到所有子序列只剩下一个数为止。

原理图解

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

实现快速排序的步骤分解

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

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

Tips:该实例中, 基准的索引值 = parseInt(序列长度 / 2)

Tips:splice方法会改变原始数组。例如,arr = [1, 2, 3]; 基准索引值为1,基准值为2,原始数组变为arr = [1, 3];

遍历序列,拆分序列

与“基准”比较大小,并拆分为两个子序列

小于“基准”的数存储于leftArr数组当中,大于等于“基准”的数存储于rightArr数组当中

Tips:当然,也可以将 小于等于“基准”的数存于leftArr,大于“基准”的数存于rightArr

由于要遍历序列,将每一个数与“基准”进行大小比较,所以,需要借助for语句来实现

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

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

function quickSort(arr) { };

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

判断子序列的长度

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

快速排序法完整代码

快速排序法的效率

时间复杂度

最坏情况:每一次选取的“基准”都是序列中最小的数/最大的数,这种情况与冒泡排序法类似(每一次只能确定一个数[基准数]的顺序),时间复杂度为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是什么,在此就不多说了,直接上图吧

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

版权声明:该图来自“【美】莉兹·克里莫 (author)”的书籍《你今天真好看》

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 懂点君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
文末的漫画插图表示没看懂额,找不到笑点~
文末的漫画插图表示没看懂额,找不到笑点~
11点赞举报
多看几下~~
多看几下~~
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
【优选算法篇】揭秘快速排序:分治算法如何突破性能瓶颈(上篇)
分治法是一种非常高效的算法设计策略,广泛应用于计算机科学的多个领域,尤其是在解决复杂问题时,它通过将大问题拆解成更小的子问题来降低问题的复杂度。快速排序(QuickSort)是分治法中的经典例子,能够在许多实际场景中提升性能。它的重要性体现在以下几个方面:
熬夜学编程的小王
2024/12/24
980
【优选算法篇】揭秘快速排序:分治算法如何突破性能瓶颈(上篇)
前端进阶必备 — 手撕排序算法
算法(Algorithm) 代表着用系统的方法描述解决问题的策略机制,可以通过一定规范的 输入,在有限时间内获得所需要的 输出。
用户1462769
2019/08/13
7050
前端进阶必备 — 手撕排序算法
一文带你读懂排序算法(五):快速排序算法
快速排序算法是一种非常高效的排序算法,它采用“分而治之”的思想,将大的拆分为小的,小的拆分为更小的。
后台技术汇
2022/05/28
7110
一文带你读懂排序算法(五):快速排序算法
八大排序算法总结与java实现
概述 因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。所以决定对我们常见的这几种排序算法进行统一总结。首先罗列一下常见的十大排序算法: 请点击此处输入图片描述 我们讨论的这八大排序算法的实现可以参考我的Github:SortAlgorithms,其中也包括了排序测试模块[Test.java]和排序算法对比模块[Bench.java],大家可以试运行。 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排序算法,他们之间关系如下: 请点击此处输入图片描述 一、直接插入排序(In
企鹅号小编
2018/01/18
1.1K0
八大排序算法总结与java实现
PHP常见排序算法整理学习
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/details/78327002
泥豆芽儿 MT
2018/09/11
9540
PHP常见排序算法整理学习
算法解析(挖坑法/快速排序)
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,代表着用系统的方法描述解决问题的策略机制。它能对一定规范的输入,在有限时间内获得所要求的输出。算法的优劣可以用空间复杂度与时间复杂度来衡量。
一百减一是零
2024/07/25
1010
[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)
插入排序是一种简单直观的排序算法,它的基本思想是将待排序的元素逐个插入到已排序序列中的适当位置,直到全部元都插入完毕。插入排序包直接插入排序和希尔排序。
小李很执着
2024/06/15
2060
[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)
PHP数据结构(二十二) ——快速排序
PHP数据结构(二十二)——快速排序 (原创内容,转载请注明来源,谢谢) 一、概述 前面的插入排序,都是以移动的方式进行排序。快速排序,则是以交换的方式进行排序。 二、冒泡排序 提到交换的方式进行排序,首先可以提到冒泡排序。 1、算法 冒泡排序是逐个进行比较再进行交换的排序方式,假设是以从小到大的顺序排列。 1)先用第一个数和第二个数比较,如果第一个数比较大,则和第二个数进行互换,否则两个数保持不变。 2)再用第二个数与第三个数比较,直至第n-1个数与第n个数进行比较。这称为一轮的冒
用户1327360
2018/03/07
1.1K0
【数据结构】排序算法---快速排序(动图演示)
算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
Crossoads
2024/10/22
4240
【数据结构】排序算法---快速排序(动图演示)
快速排序(Java分治法)
在最好情况下,每次划分对一个记录定位后,该记录的左侧子序列与右侧子序列的长度相同。在具有n个记录的序列中,一次划分需要对整个待划分序列扫描一遍,则所需时间为O(n)。设T(n)是对n个记录的序列进行排序的时间,每次划分后,正好把待划分区间划分为长度相等的两个子序列,则有:
WHYBIGDATA
2023/01/31
9150
快速排序(Java分治法)
快速排序
我们都知道,算法是解决实际问题的步骤,是前人智慧的结晶。那么为什么会有快速排序呢?这就需要了解下传统排序算法的缺点。传统的排序算法有冒泡排序、选择排序和插入排序。它们的共同点就是两两比较,算法的时间复杂度高达 O(n^2),不适合大规模排序。我们接下来来看下时间复杂度仅为 O(nlogn) 的快速排序算法,它用到了分治思想,非常巧妙。
谛听
2023/10/14
1680
算法学习:快速排序
这是算法流程的起点,从数列中精心挑选出一个元素,赋予它一个特殊角色——“基准”(pivot)。基准的选择可以很灵活,但理想情况下应倾向于选择一个能将数据集大致均匀分割的值,以促进算法效率。
空白诗
2024/06/14
1580
算法学习:快速排序
【初阶数据结构篇】冒泡排序和快速排序(中篇)
外层循环需要取等,同时在内层循环时相应left和right判断处也要取等,不然left和right相等就死循环了
半截诗
2024/10/09
1250
【初阶数据结构篇】冒泡排序和快速排序(中篇)
【初阶数据结构篇】冒泡排序、快速排序
作为第一个接触的排序算法,冒泡排序想必大家已经很熟悉了 总共n个数据,要排n-1趟 第i(i从0开始取)趟要比较n-1-i次 等差数列求和,最坏时间复杂度为O(n2) 定义exchange变量,当数组已经有序时不进入交换,直接跳出循环 最好时间复杂度为O(n) 空间复杂度O(1)
熬夜学编程的小王
2024/11/20
1550
【初阶数据结构篇】冒泡排序、快速排序
七种排序算法 冒泡,选择,插入,希尔,快速,归并,堆
排序算法可以说是数据结构与算法当中最为基础的部分,针对的是数组这一数据结构。将数组中的无序数据元素通过算法整理为有序的数据元素即为排序。
BUG弄潮儿
2021/04/26
5410
算法之旅 | 冒泡排序法
HTML5学堂-码匠:本期继续走入算法 —— 冒泡排序法。冒泡排序算法相对简单,容易上手,稳定性也比较高, 算是一种较好理解的算法,也是面试官高频提问的算法之一。 Tips:关于“算法”及“排序”的基础知识,在此前“选择排序法”中已详细讲解,可点击文后的相关文章链接查看,在此不再赘述。 冒泡排序法的原理 基本原理 从序列头部开始遍历,两两比较,如果前者比后者大,则交换位置,直到最后将最大的数(本次排序最大的数)交换到无序序列的尾部,从而成为有序序列的一部分; 下次遍历时,此前每次遍历后的最大数不再参与排序;
HTML5学堂
2018/03/13
9350
算法之旅 | 冒泡排序法
【数据结构】七大排序算法
排序的相关概念 排序的分类 根据在排序过程中带排序的记录是否全部被放置在内存中,排序分为: 内排序 外排序 1.内排序 内排序是在排序整个过程中,带排序的所有记录全部放置在内存中。 影响内排序的主要因素: 时间性能。(主要受比较和移动两种操作的影响) 辅助空间。 算法的复杂性。 内排序的分类 根据排序过程中借助的主要操作,内排序分为: 插入排序 交换排序 选择排序 归并排序 2.外排序 外排序是由于排序的记录个数太多,不能同时放置在内存中,整个排序过程需要在内外存之间多次交换数据才能进行。 按照算法的复杂
我就是马云飞
2018/02/05
1.2K0
【数据结构】七大排序算法
【地铁上的面试题】--基础部分--数据结构与算法--排序和搜索算法
排序和搜索算法是计算机科学中非常重要的算法领域。排序算法用于将一组元素按照特定的顺序排列,而搜索算法用于在给定的数据集中查找特定元素的位置或是否存在。 排序算法的基本概念是根据元素之间的比较和交换来实现排序。不同的排序算法采用不同的策略和技巧来达到排序的目的。常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序和希尔排序等。这些算法的核心思想包括比较和交换、分治法、递归等。排序算法的作用是使数据按照一定的规则有序排列,便于后续的查找、统计和处理。 搜索算法的基本概念是通过遍历数据集来找到目标元素。搜索算法的核心思想包括顺序搜索、二分搜索、广度优先搜索(BFS)、深度优先搜索(DFS)等。顺序搜索是逐个比较元素直到找到目标或遍历完整个数据集,而二分搜索是基于有序数据集进行折半查找。广度优先搜索和深度优先搜索是针对图和树等非线性结构的搜索算法,用于遍历整个结构以找到目标元素或确定其存在性。 排序算法和搜索算法在实际应用中起到至关重要的作用。排序算法可以用于对大量数据进行排序,提高数据的检索效率和处理速度。搜索算法则可以在各种应用中快速定位和获取所需信息,如在数据库中查找特定记录、在搜索引擎中查找相关结果、在图形图像处理中寻找特定图像等。对于开发者和学习者来说,理解和掌握排序和搜索算法是非常重要的。它们是基础算法,也是面试中常被问到的知识点。通过深入学习和实践排序和搜索算法,可以提高编程能力,优化算法设计,并在实际应用
喵叔
2023/07/09
2860
十种排序方法
在C语言中,有多种排序算法可供选择,每种都有其独特的特点和应用场景。以下是几种常见的排序算法及其在C语言中的总结:
ljw695
2024/10/18
1400
【初阶数据结构与算法】排序算法总结篇(每个小节后面有源码)(直接插入、希尔、选择、堆、冒泡、快速、归并、计数以及非递归快速、归并排序)
   那么本次的排序算法总结就分享到这里啦,初阶数据结构与算法这个篇章的知识也就到这里结束啦,凑巧也是2024年最后一篇文章,从2025年开始就进入C++的学习啦,感谢大家近来的支持,大家新年快乐!    bye~
TANGLONG
2025/01/09
1080
推荐阅读
相关推荐
【优选算法篇】揭秘快速排序:分治算法如何突破性能瓶颈(上篇)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档