看完动画你还敢说不会 快速排序

前言

由于LeetCode上的算法题很多涉及到一些基础的数据结构,为了更好的理解后续更新的一些复杂题目的动画,推出一个新系列 -----《图解数据结构》,主要使用动画来描述常见的数据结构和算法。本系列包括十大排序、堆、队列、树、并查集、图等等大概几十篇。

快速排序

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。

算法步骤

  1. 从数列中挑出一个元素,称为 “基准”(pivot);

  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

来源:github.com/hustcc/JS-S…

算法演示

排序动画过程解释

  1. 首先,操作数列中的所有数字

  2. 在所有数字中选择一个数字作为排序的基准(pivot), pivot 通常是随机选择的,在这里为了演示方便,我们选择最右边的数字作为 pivot

  3. 选取好 pivot 后,在操作数列中选择最左边的数字标记为 左标记 ,最右边的数字标记为 右标记

  4. 将左边的标记向右移动

  5. 当 左标记 达到超过 pivot 的数字时,停止移动

  6. 在这里,8 > 6 ,所以停止移动

  7. 然后将右边的标记向左移动

  8. 当 右标记 达到小于 pivot 的数字时,停止移动

  9. 在这里,4 > 6 ,所以停止移动

  10. 当左右标记停止时,更改标记的数字

  11. 因此,左标记 的作用是找到一个大于 pivot 的数字,右标记 的作用是找到一个小于 pivot 的数字

  12. 通过交换数字,可以在数列的左边收集小于 pivot 的数字集合,右边收集大于 pivot 的数字集合

  13. 交换之后,继续移动 左标记

  14. 在这里,9 > 6 ,所以停止移动

  15. 然后将右边的标记向左移动

  16. 当 右标记 碰撞到 左标记 时也停止移动

  17. 如果左右侧的标记停止时,并且都在同一个位置,将这个数字和 pivot 的数字交换

  18. 这就完成了第一次操作

  19. 小于 6 的都在 6 的左侧,大于 6 的都在 6 的右侧

  20. 然后递归对这分成的两部分都执行同样的操作

  21. 完成 快速排序

代码实现

为了更好的让读者用自己熟悉的编程语言来理解动画,笔者将贴出多种编程语言的参考代码,代码全部来源于网上。

C++代码实现

Java代码实现

Python代码实现

JavaScript代码实现

如果你是iOS开发者,可以在GitHub上 github.com/MisterBooo/… 获取更直观可调试运行的源码。

欢迎关注:

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

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

相关文章

java多张图片合成一张_1分钟学会“全景照片”拍摄技巧,从单反拍摄到PS合成,收藏备用...

作为一名摄影爱好者,您知道如何才能快速拍出一张全景照片,同时保证高画质和照片不畸变?比如下面的2张图片:要想得到这样的全景照片,千万不要通过后期裁剪,否则清晰度肯定会大打折扣!其实&#x…

Chrome查看cookie

不同版本的Chrome查看cookie的入口位置不同,这里介绍个通用的方法。 1.进入设置页 2.搜索cookie 3.进入“cookie....”,选择“查看所有......”

console 速查手册

// 用于输出一个 js 对象列表* console.log(obj1 [, obj2, ..., objN); // // 一个 js 字符串,其中包含0或多个不同类型的替代字符串 // console.log(String: %s, Int: %d,Float: %f, Object: %o, str, ints, // floats, obj) // // 也支持模板字符串 // console.lo…

nginx 带宽_Nginx的Gzip功能

程序员自由之路 | 作者urlify.cn/eyuUVr | 来源什么是HTTP压缩有时候客户端和服务器之间会传输比较大的报文数据,这时候就占用较大的网络带宽和时长。为了节省带宽,加速报文的响应速速,可以将传输的报文数据先进行压缩,然后再进行…

分享朋友圈QQ空间需要哪些参数

shareTitle(分享标题 , shareDes(分享描述 , shareImg(分享图片地址, shareUrl(分享地址, shareType(分享类型,微信朋友:WEIXIN、微信朋友圈:WEIXIN_CIRCLE、QQ:QQ)

【今日头条】【抖音火山】前端开发实习生

今日头条成立于2012年,致力于成为最懂你的信息平台,连接人与信息,促进内容的创作和交流。通过技术,来改变整个内容生产、消费领域。 5年的时间内,我们已经成为了一个估值过百亿美元,用户数亿,DA…

程序员真的是吃青春饭的吗?(献给即将进入职场的程序员们)

又有学生问我:程序员真的是吃青春饭的吗?我是不是做到三十岁就该考虑转型了? 我告诉他们: 这是中国的记者们用统计数字造下的一个弥天大谎,当我们看到微软集团内的许多白发程序员在兢兢业业地工作的时候,我…

这一年多来,阿里Blink测试体系如何从0走向成熟?

2019独角兽企业重金招聘Python工程师标准>>> 摘要: 引言 Apache Flink是面向数据流处理和批处理的分布式开源计算框架,2016年阿里巴巴引入Flink框架,改造为Blink。2017年,阿里整合了所有流计算产品,决定以B…

numpy中一些常见计算

文章目录 numpy中的一些常见计算代码方差标准差参考文献numpy中的一些常见计算 代码 import numpy as np from scipy import stats# 示例数据 data = np.array([1, 2,

system函数_自学C++基础教程【函数】

函数的概念一个函数由:函数的返回值类型、函数名、参数表、函数体 这4个部分组成。int Add( int _a , int _b ) {return _a _b; }该函数 Add 完成对两个整型数据的求和功能。函数的调用方式: 函数名(参数表);…

宁波政务云资源的介绍与申请

介绍 如图所示: 宁波政务云分公共服务区与资源共享区。 公共服务区 公共服务区,一般部署允许互联网访问的系统,数据不敏感,不重要的,可对外开发的系统。 该区允许互联网访问,不允许访问资源共享区&…

redis查数据

1 连接服务 12345[rootredis1-20 ~]# telnet 127.0.0.1 6380Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is ^].#用telnet也能登录,但是无法查看key的value12[rootredis1-20 src]# ./redis-cli -p 6380#redis可能有好几个服务,要指定端…

python帮助文档在哪_python文档在哪里

对于Python中一些不清楚的模块,可以通过文档学习如何使用,但是python文档在哪里呢?这个问题我们可以使用Python命令进行查看。方法一 在python命令行输入以下内容help(time) # 很详细的模块文档 help(time.localtime()) # 很详细的函数文档 h…

政务云公共服务区与资源共享区数据交换的方式

上文《宁波政务云资源的介绍与申请》介绍过,公共服务区与资源共享区是不能互访的,只能是资源共享区单向访问公共服务区。 我有一项目,要能互联网访问,又要访问“宁波大数据共享平台”的接口,“宁波大数据共享平台”在…

Java程序员的IntelliJ IDEA使用教程

前言 博主是Java程序员,以前一直都用myeclipse来开发的,说实话感觉myeclipse毫无美感可言,后来经过同事介绍,认识了IDEA,一眼就相中了IDEA黑色的主题风格,自此就抛弃了旧爱myeclipse。当时还不懂IDEA功能上…

python中random函数用法_random函数的用法

展开全部 用法: 1、随2113机生成(0,1)之间的浮点数 random.random() 2、随机生成100-200的整数5261 random.randint(100,200) 3、随机产生范围为410210间隔为2的数 random.randrange(0,11,2) 注:这里输出(0,2,4,6,8,10…

提防易怒的危机

我工作多年,多年来认识一些官场、商场的人。 我与他们相处时,深深体会到太忙、太累的主管,常呈现的状态是“易怒”。 这些人精神绷得太紧,体力透支,睡眠不足,开会太久,长期都在赶进度。 易怒…

2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)

2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) 思路: A Exam 思路:水题 代码: #include<bits/stdc.h> using namespace std; int main(){int k;scanf("%d",&k);char s1[1010],s2[1010];scanf("%s%s",s1,s2);int same0;int ns…

python random()*10的值不可能是_Python

Python 生成随机数、随机字符串 #!/usr/bin/python # -*- coding: UTF-8 -*- import random import string # 随机整数&#xff1a; print random.randint(1,50) # 随机选取0到100间的偶数&#xff1a; print random.randrange(0, 101, 2) # 随机浮点数&#xff1a; print rand…

Prince2与PMP的区别

p2有7个原则&#xff0c;7个主题&#xff0c;7个流程&#xff0c;即37二十一。 P2有26个管理产品模板。 2009版本是经典版本&#xff0c;2017版本与2009版本内容基本没变&#xff0c;梳理了目录&#xff0c;使内容更加有可读性。 P2是非常好的项目管理方法论&#xff0c;任何…