第 26 题:如何理解快速排序?

子瑜
• 阅读 762

什么是快速排序?

在一个序列中随机找出一个数(称为基准元素),然后就是比基准元素小的数放在左边,比基准元素大的数放在右边,这样就将一个序列分成了两个子序列,然后再按照同样的方法把子序列再分成更小的子序列,直到不能分解为止

栗子

<img src="https://noxussj.top:3000/26/1.png"></img>

紫色:基准元素

绿色:比基准元素小的数

黄色:比基准元素大的数

算法描述

假设一组序列为 6, 9, 2, 4, 5, 1, 8, 7

首先随机找一个数(6)

判断比 6 小的放在左边,大的放在右边

结果:2, 4, 5, 1, 6, 9, 8, 7

得到 2 个新的序列,左边(2, 4, 5, 1),右边(6, 8, 7)

-------------------------------------------------

然后对左边序列进行拆分,右边序列就不列举了

序列 2, 4, 5, 1

随机找一个数(2)继续进行判断,比 2 小的放在左边,大的放在右边

结果:1, 2, 4, 5

得到 2 个新的序列,左边(1),右边(4, 5)

-------------------------------------------------

然后发现左边序列(1)不能够进行拆分,所以要进行向上合并

右边序列(4, 5)可以继续拆分

随机找一个数(4)继续进行判断,比 4 小的放在左边,大的放在右边

结果:4, 5

得到新的序列,左边(4),右边(5)

然后发现左边序列(4)和右序列(5)不能够进行拆分,所以要进行向上合并

-------------------------------------------------

所有元素向上合并后得到结果

1, 2, 4, 5, 6, 7, 8

<img src="https://noxussj.top:3000/26/2.gif"></img>

如果还是看不懂这个图,那证明你还没理解快速排序
个人建议,最好拿笔和纸自己试着排列一下

参考资料
值得收藏的十大经典排序算法
漫画:什么是快速排序?(完整版)

文章的内容/灵感都从下方内容中借鉴

点赞
收藏
评论区
推荐文章
22 22
4年前
【排序算法动画解】简单选择排序
本文为系列专题的第13篇文章。1.2.3.4.5.6.7.8.9.10.11.12.在文章【】中,我们介绍了暴力排序和冒泡排序这两种排序算法,算是一个引子。同时指出暴力排序和冒泡排序的缺点硬伤。本文介绍的简单选择排序则“医治”了上面提到的暴力排序和冒泡排序的“硬伤”。核心思想:从数组的第一个元素开始,将其作为基准元素,然后找出基准
Wesley13 Wesley13
3年前
java 冒泡排序
思路1.将序列当中的左右元素,依次比较,保证右边的元素始终大于左边的元素;(第一轮结束后,序列最后一个元素一定是当前序列的最大值;)2.对序列当中剩下的n1个元素再次执行步骤1。3.对于长度为n的序列,一共需要执行n1轮比较时间复杂度最佳情况:T(n)O(n)最差情况:T(n)O(n2)平均情
CuterCorley CuterCorley
4年前
Python 列表 使用技巧
@toc1.列表表达式与列表排序列表中的元素也是可迭代的对象如列表、元组等时,要根据这些元素的某个子元素对列表排序,常规排序方式失效,需要用sorted()函数并指定key。题目:输入一组数到列表nums,请找到列表中任意两个元素相加能够等于9的元素,形成一个元组,使其小数在前大数在后,如:(2,7),(1,8)。重复的元组元素只保留一个,结
DaLongggggg DaLongggggg
4年前
python-算法训练 区间k大数查询
问题描述给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。输入格式第一行包含一个数n,表示序列长度。第二行包含n个正整数,表示给定的序列。第三个包含一个正整数m,表示询问个数。接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。输出格式总共输出m行,每行一个数
Wesley13 Wesley13
3年前
BFPRT线性查找算法
介绍:BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分析,BFPRT可以保证在最坏情况下仍为线性时间复杂度。该算法的思想与快速排序思想相似,当然,为使得算法在最坏情况下,依然能达到o(n)的时间复杂度,五位算法作者做了精妙的处理。时间复杂度O(N)算法步骤
Wesley13 Wesley13
3年前
PHP快速排序(原地切分)
        快速排序是一种分治的排序算法,采用递归的思想,将数组元素分为两部分,选择切分元素,左右扫描数组,将大于切分元素的数据放在右边,小于切分元素的数据放在左边,直到扫描指针相遇,切分结束,同时递归调用,直到数组有序。      代码如下:<?phpfunctionquick_sort(array&$array,$l
Stella981 Stella981
3年前
Javascript数组系列一之栈与队列
所谓数组(英语:Array),是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。---百度百科简单理解,数组就是数据的有序列表。Array在Javascript中属于最常用的数据类型之一了,与其它语言一样Javascript中的数
菜园前端 菜园前端
2年前
什么是选择排序?
原文链接:什么是选择排序(selectSort)?选择排序就是在一个排列中划分为有序区和无序区,有序区在左边,无序区在右边。首先在无序区中找到最小元素,存放到有序区的起始位置,然后再从剩余的无序区中继续寻找最小元素,然后放到有序区的末尾。以此类推,直到无序
菜园前端 菜园前端
2年前
什么是归并排序?
原文链接:什么是归并排序(mergeSort)?主要分成两部分实现,分、合操作:分:把数组分成两半,在递归地对子数组进行"分"操作,直到分成一个个单独的数合:把两个数组合并为有序数组,再对有序数组进行合并,直到全部子数组合并为一个完整数组归并排序就是采用了
菜园前端 菜园前端
2年前
什么是快速排序?
原文链接:什么是快速排序(quickSort)?主要分成两部分实现,分区、递归操作。分区从数组中任意选择一个"基准",所有比基准小的元素放在基准前面,比基准大的元素放在基本后面。递归递归地对基准前后的子数组进行分区。算法步骤1.首先获取数组的第一个值(作为
时间复杂度为 O(nlogn) 的排序算法 | 京东物流技术团队
归并排序归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解,归并排序的步骤如下:划分:分解待排序的n个元素的序列成各具n/2个元素的两个子序列,将长数组的排序问题转换为短数