当前位置: 首页 > news >正文

快速排序算法原理 Quicksort —— 图解(精讲) JAVA

快速排序是 Java 中 sort 函数主要的排序方法,所以今天要对快速排序法这种重要算法的详细原理进行分析。

思路:首先快速排序之所以高效一部分原因是利用了离散数学中的传递性

例如 1 < 2 且 2 < 3 所以可以推出 1 < 3。在快速排序的过程中巧妙地使用了这个原理,所以快速排序在一般情况下效率是比其他排序高。

下面用一个示例对快速排序的运行过程进行模拟:

[4, 3, 5, 1, 2]

利用快速排序运行过程如下:

1.首先我们要设立基准,一般选择最左边的数即 temp = 4;

2. 对于 j 让其往左边移动直到遇到第一个比 temp小的数停下来。这样才能执行第3步。

3.再让 i 向右边移动直到遇到第一个比temp大的数停下来。

执行完后 i ,j 分别停留在 5,2的位置。

4.交换 i 与 j  位置所对应元素(如下图所示):

 2. 对于 j 让其往左边移动直到遇到第一个比 temp小的数停下来。

3.再让 i 向右边移动直到遇到第一个比temp大的数停下来。

上述在执行步骤 3 的时候由于 i = j 了所以不再让 i 右移动了。让 temp 与  i,j 指向的元素 交换一下即可(1与4交换位置)这样temp左边的数都比基准小,右边的数都比它大。操作完后如下所示:

以 temp 为分界线分别对左边和右边部分进行上述操作(由于分界线右边部分只有一个元素所以不必再操作):

1.首先我们要设立基准,一般选择最左边的数即 temp = 1;

2. 对于 j 让其往左边移动直到遇到第一个比 temp小的数停下来。

由于 i = j,所以严格按照规则 temp 会与temp本身交换,交换后 temp 成为了分界线,要对其左边和右边元素分别进行上述规定操作(由于temp左边没有元素所以不再操作)对分界线右边元素操作如下图所示:

1.首先我们要设立基准,一般选择最左边的数即 temp = 3;

2.对于 j 让其往左边移动直到遇到第一个比 temp小的数停下来 。

3.再让 i 向右边移动直到遇到第一个比temp大的数停下来。

由于 i = j 所以 i 不再向右移动了将 i ,j 对应元素于temp交换。得到:

left                                 right

2                                        3    

                                           i     

                                           j    

                                        temp

此时 temp为分界线,由于temp左边只有一个数,右边没有数,所以不再对分界线左右两边进行操作了。

将每一部分的运行结果拼接起来就是快速排序后的数组 [1, 2, 3, 4, 5]

需要注意的是:为什么每次都是 j 先移动,而不是i?

因为 j 的目标是找到一个比 temp 小的数,所以当 j 移动完后 j 所对应的元素大小是小于等于temp的。

i 如果再向 j 靠近的途中没有发现比temp大的数则最后会以 i = j 结束,此时 i,j所指向的元素比小于等于 temp,此时交换 i,temp 所对应元素,交换完后刚好能使temp左边不比它大,右边不比它小。

反之先移动 i 情况就相反了,不符合我们所要求的结果。 

理论成立快排代码如下:

class Solution{public void Quicksort(int a[], int left, int right) {int temp = 0;int next = 0;if(left >= right) return;//退出条件temp = a[left];int i = left;int j = right;while(i != j) {//结束循环条件while(i < j && a[j] >= temp) j --;//找到比temp小的数while(i < j && a[i] <= temp) i ++;//找比temp大的数if(i == j) {next = a[left];a[left] = a[i];a[i] = next;}//与基准交换else {next = a[i];a[i] = a[j];a[j] = next;}//i,j交换}//i,j为分界线Quicksort(a, left, i - 1);//递归分界线左边Quicksort(a, i + 1, right);//递归分解线右边}
}

对几种特殊情况的解释:当 j 向左移动时没有找到比 temp 小的数,最后会以 i = j 收尾,此种情况说明 temp 已经是最小的数了,而且 temp 就在最左侧,对 temp 右边数进行后续快排操作完全没问题。

当 j 找到比 temp 大的数,i 向右移动的过程中没有找到比 temp 大的数,最后也会以 i = j 收尾。此种情况说明 i 和 j 左边元素都不比 temp 大,右边元素都不比temp小此时 i,j 所对应元素是比temp 小的,然后交换temp 与 i ,j 所对应元素刚好使得交换后temp左边元素不比temp大,右边元素不比temp小。

相关文章:

快速排序算法原理 Quicksort —— 图解(精讲) JAVA

快速排序是 Java 中 sort 函数主要的排序方法&#xff0c;所以今天要对快速排序法这种重要算法的详细原理进行分析。 思路&#xff1a;首先快速排序之所以高效一部分原因是利用了离散数学中的传递性。 例如 1 < 2 且 2 < 3 所以可以推出 1 < 3。在快速排序的过程中巧…...

linux环境搭建私有gitlab仓库

搭建之前&#xff0c;需要安装相应的依赖包&#xff0c;并且要启动sshd服务(1).安装policycoreutils-python openssh-server openssh-clients [rootVM-0-2-centos ~]# sudo yum install -y curl policycoreutils-python openssh-server openssh-clients [rootVM-0-2-centos ~]…...

SpringSecurity授权

文章目录工具类使用自定义失败处理代码配置跨域其他权限授权hasAnyAuthority自定义权限校验方法基于配置的权限控制工具类 import javax.servlet.http.HttpServletResponse; import java.io.IOException;public class WebUtils {/*** 将字符串渲染到客户端** param response 渲…...

学习 Python 之 Pygame 开发坦克大战(一)

学习 Python 之 Pygame 开发坦克大战&#xff08;一&#xff09;Pygame什么是Pygame?初识pygame1. 使用pygame创建窗口2. 设置窗口背景颜色3. 获取窗口中的事件4. 在窗口中展示图片(1). pygame中的直角坐标系(2). 展示图片(3). 给部分区域设置颜色5. 在窗口中显示文字6. 播放音…...

2.5|iot冯|方元-嵌入式linux系统开发入门|2.13+2.18

一、 Linux 指令操作题&#xff08;共5题&#xff08;共 20 分&#xff0c;每小题 4分&#xff09;与系统工作、系统状态、工作目录、文件、目录、打包压缩与搜索等主题相关。1.文件1.1文件属性1.2文件类型属性字段的第1个字符表示文件类型&#xff0c;后9个字符中&#xff0c;…...

一起Talk Android吧(第四百九十六回:自定义View实例二:环形进度条)

文章目录 知识回顾实现思路实现方法示例代码各位看官们大家好,上一回中咱们说的例子是"如何使用Java版MQTT客户端",这一回中咱们说的例子是"自定义View实例二:环形进度条"。闲话休提,言归正转,让我们一起Talk Android吧! 知识回顾 看官们,我们又回…...

上传图片尺寸校验

使用方法 ● Image ● URL ● onload代码&#xff1a; async validImageSize(file, imgWidth, imgHeight) {const img new Image()img.src URL.createObjectURL(file)const { w, h } await new Promise((resolve, reject) > {img.onload () > {const { width: w, he…...

【Python】缺失值处理和拉格朗日插值法(含源代码实现)

目录&#xff1a;缺失值处理和拉格朗日插值法一、前言二、理论知识三、代码实现一、前言 对于含有缺失值的数据集&#xff0c;如果通过删除小部分记录达到既定的目标&#xff0c;那么删除含有缺失值的记录的方法是最有效的。然而&#xff0c;这种方法也有很多问题&#xff0c;…...

SpringCloudAlibaba-Sentinel

一、介绍官网&#xff1a;https://github.com/alibaba/Sentinel/下载jar包,启动,访问http://localhost:8080/创建module添加如下依赖<!--SpringCloud ailibaba sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring…...

【程序化天空盒】过程记录02:云扰动 边缘光 消散效果

写在前面 写在前面唉&#xff0c;最近筋疲力竭&#xff0c;课题组的东西一堆没做&#xff0c;才刚刚开始带着思考准备练习作品&#xff0c;从去年5月份开始到现在真得学了快一年了&#xff0c;转行学其他的真的好累&#xff0c;&#xff0c;不过还是加油&#xff01; 下面是做…...

链表OJ(三) 反转链表合集

目录 反转链表 反转链表 II 链表中的节点每k个一组翻转 描述 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 数据范围&#xff1a; 0≤n≤10000≤…...

SQLSERVER2019安装步骤过程

第一步官网下载SQLSERVER软件包 目前官网只能下载最新版本2022版本。 通过迅雷下载网址 SQL Server 2019 Enterprise (x64) - DVD (Chinese-Simplified)企业版 ed2k://|file|cn_sql_server_2019_enterprise_x64_dvd_2bfe815a.iso|1632086016|58C258FF0F1D006DD3C1F5F17AF3E…...

Java模块化概述

3 模块化 3.1 模块化概述 Java语言随着这些年的发展已经成为了一]影响深远的编程语言&#xff0c;无数平台,系统都采用Java语言编写。但是&#xff0c;伴随着发展&#xff0c;Java也越来越庞大&#xff0c;逐渐发展成为-门“臃肿” 的语言。而且&#xff0c;无论是运行个大型的…...

Connext DDSPersistence Service持久性服务(2)

可选数据库组件及兼容性当Persistence Service配置为PERSISTENT模式时,您可以选择将主题数据存储在文件中还是存储在外部关系数据库中。 唯一支持的外部数据库是MySQL。 当PersistenceService在PERSISTENT模式下使用时,您可以将其配置为将DDS样本存储到关系数据库中,例如MyS…...

MongoDB

MongoDB 应用场景 ​ 在传统数据库&#xff08;Mysql&#xff09;&#xff0c;在数据操作的 **High performance 对数据库高并发读写的需求、Hugu Storage 对海量数据的高效率存储和访问的需求、High Scalability && High Availability 对数据库高扩展和高可用性的需…...

python 迭代器生成器

目录 一、可迭代对象 1.1 判断是否为可迭代对象 二、迭代器 2.1 判断对象是否是一个迭代器 2.2 手写一个迭代器 2.3 迭代器应用场景 三、生成器 3.1 生成器介绍 3.2 使用yield 关键字 生成器&#xff0c;来实现迭代器 3.3 生成器&#xff08;yield关键字&#xff09;…...

Iceberg基于Spark MergeInto语法实现数据的增量写入

SPARK SQL 基本语法 示例SQL如下 MERGE INTO target_table t USING source_table s ON s.id t.id //这里是JOIN的关联条件 WHEN MATCHED AND s.opType delete THEN DELETE // WHEN条件是对当前行进行打标的匹配条件 WHEN MATCHED AND s.opType update THEN…...

JavaScript Array(数组) 对象

JavaScript 中的 Array&#xff08;数组&#xff09;对象是一种用来存储一系列值的容器&#xff0c;它可以包含任意类型的数据&#xff0c;包括数字、字符串、对象等等。通过使用数组对象&#xff0c;我们可以轻松地组织和处理数据&#xff0c;以及进行各种操作&#xff0c;比如…...

Debian如何更换apt源

中科大 deb https://mirrors.ustc.edu.cn/debian/ stretch main non-free contrib deb https://mirrors.ustc.edu.cn/debian/ stretch-updates main non-free contrib deb https://mirrors.ustc.edu.cn/debian/ stretch-backports main non-free contrib deb-src https://mirr…...

Connext DDSPersistence Service持久性服务

DDS持久性服务,它保存了DDS数据样本,以便即使发布应用程序已经终止,也可以稍后将其发送到加入系统的订阅应用程序。 简介Persistence Service是一个Connext DDS应用程序,它将DDS数据样本保存到临时或永久存储中,因此即使发布应用程序已经终止,也可以稍后将其交付给加入系…...

自抗扰控制ADRC之微分器TD

目录 前言 1 全程快速微分器 1.1仿真分析 1.2仿真模型 1.3仿真结果 1.4结论 2 Levant微分器 2.1仿真分析 2.2仿真模型 2.3仿真结果 3.总结 前言 工程上信号的微分是难以得到的&#xff0c;所以本文采用微分器实现带有噪声的信号及其微分信号提取&#xff0c;从而实现…...

链表学习之复制含随机指针的链表

链表解题技巧 额外的数据结构&#xff08;哈希表&#xff09;&#xff1b;快慢指针&#xff1b;虚拟头节点&#xff1b; 复制含随机指针的链表 该链表节点的结构如下&#xff1a; class ListRandomNode { public:ListRandomNode() : val(0), next(nullptr), random(nullptr…...

【人脸检测】Yolov5Face:优秀的one-stage人脸检测算法

论文题目&#xff1a;《YOLO5Face: Why Reinventing a Face Detector》 论文地址&#xff1a;https://arxiv.org/pdf/2105.12931.pdf 代码地址&#xff1a;https://github.com/deepcam-cn/yolov5-face 1.简介 近年来&#xff0c;CNN在人脸检测方面已经得到广泛的应用。但是许多…...

【Unity3d】Unity与Android之间通信

在unity开发或者sdk开发经常遇到unity与移动端原生层之间进行通信&#xff0c;这里把它们之间通信做一个整理。 关于Unity与iOS之间通信&#xff0c;参考【Unity3d】Unity与iOS之间通信 Unity(c#)调用Android (一)、编写Java代码 实际上&#xff0c;任何已经存在的Java代码…...

Allegro如何更改DRC尺寸大小操作指导

Allegro如何更改DRC尺寸大小操作指导 在做PCB设计的时候,DRC可以辅助设计,有的时候DRC的尺寸过大会影响视觉,Allegro支持将DRC的尺寸变小或者改大 如下图,DRC尺寸过大 如何改小,具体操作如下 点击Setup选择Design Parameters...

Mongodb WT_PANIC: WiredTiger library panic

文章目录故障现象排查过程1.查看Log2.同步恢复数据故障现象 周五突然收到Mongo实例莫名奇妙挂了告警&#xff0c;一般都是RS复制集架构模式&#xff08;5节点&#xff09;&#xff0c;查看此实例角色为SECONDAR&#xff0c;挂了暂时不影响线上业务&#xff0c;但还是需要尽快修…...

【HTML】HTML 表格总结 ★★★ ( 表格标签 | 行标签 | 单元格标签 | 表格标签属性 | 表头单元格标签 | 表格标题标签 | 合并单元格 )

文章目录一、表格标签组成 ( 表格标签 | 行标签 | 单元格标签 )二、table 表格属性 ( border 属性 | align 属性 | width 属性 | height 属性 )三、表头单元格标签四、表格标题标签五、合并单元格1、合并单元格方式2、合并单元格顺序3、合并单元格流程六、合并单元格示例1、原始…...

linux013之文件和目录的权限管理

用户、组、文件目录的关系&#xff1a; 简介&#xff1a;用户和组关联&#xff0c;组合文件目录关联&#xff0c;这样就实现了用户对文件的权限管理。首先来看一下&#xff0c;一个文件或目录的权限是怎么查看的&#xff0c;ls -l&#xff0c; 如下&#xff0c;这个信息怎么看呢…...

设计模式之状态模式

什么是状态模式 状态模式是指允许一个对象在其内部状态改变时改变他的行为&#xff0c;对象看起来似乎改变了整个类。     状态模式将一个对象在不同状态下的不同行为封装在一个个状态类中&#xff0c;通过设置不同的状态对象可以让环境对象拥有不同的行为&#xff0c;而状…...

XQuery 选择 和 过滤

XML实例文档 我们将在下面的例子中继续使用这个 "books.xml" 文档&#xff08;和上面的章节所使用的 XML 文件相同&#xff09;。 在您的浏览器中查看 "books.xml" 文件。 选择和过滤元素 正如在前面的章节所看到的&#xff0c;我们使用路径表达式或 FL…...

网站开发包括网站的/seo专员是什么意思

题目描述 在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶、门被吹飞了。 好在许多牛正在度假&#xff0c;所以牛棚没有住满。 牛棚一个紧挨着另一个被排成一行&#xff0c;牛就住在里面过夜。 有些牛棚里有牛&#xff0c;有些没有。 所有的牛棚有相同的宽度。 自门遗…...

web网站开发实训总结/品牌推广的概念

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/81158566 定义问题 外部排序指的是大文件的排序&#xff0c;即待排序的记录存储在外存储器上&#xff0c;待排序的文件无法一次装入内存&#x…...

开发网站好还是app/上海网站设计

2019独角兽企业重金招聘Python工程师标准>>> 在前文我们介绍了如何使用Redis或者Caffeine来做缓存。 Spring Boot缓存实战 Redis 设置有效时间和自动刷新缓存-2Spring Boot缓存实战 Caffeine问题描述&#xff1a; 通过使用redis和Caffeine来做缓存&#xff0c;我们会…...

网站建设营销话术/青岛seo代理计费

2019独角兽企业重金招聘Python工程师标准>>> 根据《深入浅出设计模式(C#/Java版)》所述, Strategy模式的应用场景是:1. 多个类的分别只是在于行为不同2. 你需要对行为的算法做很多变动3. 客户不知道算法要使用的数据 Template Method模式的应用场景是:1. 你想将相同…...

网站销售怎么做/百度热搜榜排行

阅读本文大概需要 3 分钟&#xff0c;挑书可能需要很多分钟。六一八来了&#xff0c;现在各大平台都开始促销了&#xff0c;作为一名程序员&#xff0c;除了自己买一些大件和帮女朋友疯狂抢购&#xff0c;最好的选择就是买书好好学习技术了。关注我的朋友可能很多都是学习 Java…...

设计师的素材网站/端口扫描站长工具

小波与小波变换_图文_百度文库 https://wenku.baidu.com/view/d55626d9ac51f01dc281e53a580216fc700a5361.html 图像Haar小波变换 - HanFeiKei的博客 - CSDN博客 https://blog.csdn.net/HanFeiKei/article/details/83584963 转载于:https://www.cnblogs.com/wxl845235800/p/996…...