【排序】快速排序

思想

快速排序是一种基于分治策略的排序算法,其核心思想通过选取一个基准元素,将数组分成两个子数组:一个包含小于基准元素的值,另一个包含大于基准元素的值。然后递归地对这两个子数组进行排序,最终将它们合并起来,得到有序的数组。

图解实现

在这里插入图片描述

具体代码实现

public static int[] quickSort(int[] arr, int leftIndex, int rightIndex) {// 递归结束条件 左边索引小于右边索引if (leftIndex < rightIndex) {// 通过分区函数得到基准元素的索引int pivotIndex = partition(arr, leftIndex, rightIndex);//递归对基准元素左边的子数组进行快速排序quickSort(arr, leftIndex, pivotIndex - 1);//递归对基准元素右边的子数组进行快速排序quickSort(arr, pivotIndex + 1, rightIndex);}return arr;
}/*** 分区函数** @param arr        数组* @param leftIndex  左索引* @param rightIndex 右索引* @return 返回基准元素的索引*/
private static int partition(int[] arr, int leftIndex, int rightIndex) {// 基准元素是最后一个元素int baseNum = arr[rightIndex];// 左边索引小于右边索引就一直循环while (leftIndex < rightIndex) {// l < r 且 左边的元素一直小于基准元素,左边索引做加1操作(因为要放在基准元素左边)while (leftIndex < rightIndex && arr[leftIndex] <= baseNum) {leftIndex++;}// 如果不满足上边条件,说明此时这个值要比基准元素大,就放在基准元素右边。把左边元素值直接赋给右边即可(注意基准元素全局不参与运算,存在的意义只是比较而已)arr[rightIndex] = arr[leftIndex];// l < r 且 右边的元素一直大于基准元素,右边索引做减1操作(因为要放在基准元素右边)while (leftIndex < rightIndex && arr[rightIndex] >= baseNum) {rightIndex--;}// 如果不满足上边条件,说明此时这个值要比基准元素小,就放在基准元素左边。把右边元素值直接赋给左边即可arr[leftIndex] = arr[rightIndex];}// 走到这里说明 leftIndex < rightIndex 这个条件就不满足了,也就是说 leftIndex = rightIndex,这个时候把基准元素的值复制在这个位置即可,// 并返回此时这个位置的索引即可。arr[leftIndex] = baseNum;return leftIndex;
}

建议

仔细看那个图解思路实现,先把思路搞清楚,然后写代码具体实现。别人写的代码终究是别人理解之后写出来的,要搞明白其中思路。一定一定要多动手实现,多写代码,多Debug。
纸上得来终觉浅,绝知此事要躬行

参考链接

https://blog.csdn.net/qq_39181839/article/details/109478094

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

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

相关文章

UltraScale 和 UltraScale+ 生成已加密文件和已经过身份验证的文件

注释 &#xff1a;如需了解更多信息&#xff0c;请参阅《使用加密和身份验证确保 UltraScale/UltraScale FPGA 比特流的安全》 (XAPP1267)。 要生成加密比特流&#xff0c;请在 Vivado IDE 中打开已实现的设计。在主工具栏中&#xff0c;依次选择“Flow” → “Bitstream Setti…

解决在eclipse2021中,用mysql-connector-java-8.0.18.jar不兼容,导致无法访问数据库问题

1.环境场景 组件版本mysql5.7.44mysql-connector-java80.18 2. 问题描述 报mysql-connector-java 驱动连不上mysql数据库。 3. 可能的原因分析 查看数据库连接句柄是否对 如果数据库连接句柄中没有 useSSLfalse 的话可能会导致这样的问题。 就像下面这样&#xff1a; jdb…

c# 类的方法链接例子

在这个示例中&#xff0c;我们创建了一个名为 Calculator 的类&#xff0c;它具有一些简单的数学运算方法&#xff0c;如 Add()、Subtract()、Multiply() 和 Divide()。每个方法都会对内部的 result 成员变量进行相应的操作&#xff0c;并返回 Calculator 对象本身&#xff0c;…

FRPS配置服务端(腾讯云)、客户端(PC电脑Windows、树莓派Debian)并设置虚拟域名

1.服务端&#xff08;腾讯云&#xff09;&#xff1a;frps.ini [common] bind_port 7000 vhost_http_port8080 vhost_https_port44344 dashboard_port 7500 privilege_token your_password subdomain_host example.com use_encryption true encryption_method tls dashb…

搭建zuul网关

1. 路由知识 有关网关的很多知识我们都在04.gateway讲解了&#xff0c;有关网关的详细知识可以到上节详细了解。本节我们主要来讲解下另一个网关zuul。本节结合之前的章节网关搭建的项目案例上实现zuul的搭建&#xff0c;侧重于实战。 2. Zuul现状 zuul官方文档 zuul截止clo…

【ZooKeeper高手实战】ZooKeeper 工业级的场景(配置中心、日志系统、数据同步系统)

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…

深入理解 Hadoop (五)YARN核心工作机制浅析

概述 YARN 的核心设计理念是 服务化&#xff08;Service&#xff09; 和 事件驱动&#xff08;Event EventHandler&#xff09;。服务化 和 事件驱动 软件设计思想的引入&#xff0c;使得 YARN 具有低耦合、高内聚的特点&#xff0c;各个模块只需完成各自功能&#xff0c;而模…

熟悉HDFS常用操作

1. 利用Hadoop提供的Shell命令完成下列任务 (1)向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件。 #检查文件是否存在./bin/hdfs dfs -test -e text.txt echo $? #结果是1 代表已存在 #根据结果判断出文件已存…

dubbo与seata集成

1.seata是什么? Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 2.seata的注解 GlobalTransactional&#xff1a;全局事务注解&#xff0c;添加了以后可实现分布式事务的回滚和提交&#xff0c;用法与spring…

VMware虚拟机安装Ubuntu

准备:Ubuntu的镜像文件,VMware,手. 1.新建虚拟机&#xff0c;选择自定义&#xff0c;下一步。 2.硬件兼容性&#xff0c;选择Workstation 16.x&#xff0c;下一步。 3.选择安装程序光盘映像文件&#xff0c;路径为映像文件所在文件夹&#xff0c;下一步。 4. 创建用户和设置密…

hive 函数使用详解

一、前言 在任何一种编程语言中,函数可以说是必不可少的,像mysql、oracle中,提供了很多内置函数,或者通过自定义函数的方式进行定制化使用,而hive作为一门数据分析软件,随着版本的不断更新迭代,也陆续出现了很多函数,以满足日常数据查询与分析的各种场景。 二、hive 函…

GEE中导入研究区shape

找到Assets&#xff0c;新建NEW 等待上传完成 从Assets列表中找到导入文件&#xff0c;复制ID

Docker 方式安装 RabbitMQ

安装步骤 安装 Docker 和 Docker Compose&#xff1a;首先&#xff0c;确保您的 Linux 系统已安装 Docker 和 Docker Compose。如果未安装&#xff0c;您可以通过官方 Docker 文档找到安装指南。 创建 docker-compose.yml 文件&#xff1a;接下来&#xff0c;创建一个 docker-…

106短信群发如何发送会员通知

106短信群发可以通过以下步骤发送会员通知&#xff1a; 1.确定通知内容&#xff1a;首先需要确定要发送的通知内容&#xff0c;包括通知的主题、内容、时间、地点等信息。 2.设计通知模板&#xff1a;根据通知内容&#xff0c;设计通知模板。模板应包括短信的格式、语言风格、…

【华为OD机试真题2023CD卷 JAVAJS】贪吃的猴子

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 贪吃的猴子 知识点数组 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 一只贪吃的猴子,来到一个果园,发现许多串香蕉排成一行,每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。猴子获取香蕉,…

AI教我学编程之C#入门程序详解与拓展

与AI肩并肩 前言一、一个简单的C#程序补充说明对话AI 二、标识符三、关键字四、Main五、空白1. 缩进2. 代码块的间距3. 操作符的空格4. 换行5. 一致性 六、语句七、从程序输出文本主题&#xff1a;从程序中输出文本1. Write 和 WriteLine 方法2. 格式字符串3. 多重标记和值4. 格…

Banner设计专家详细解释和使用技巧!

一、banner的作用 宝安在运营工作中具有吸引注意力、提高转化率、传达信息、提升品牌形象、引导用户行为、营造活动氛围等多种功能。因此&#xff0c;在运营工作中&#xff0c;需要根据具体需要和目标精心设计和合理使用宝安&#xff0c;才能达到更好的运营效果。 二、banner…

前端工程师常用的ChatGPT通用提示词模板

HTML/CSS基础&#xff1a;如何熟练掌握HTML/CSS基础&#xff0c;包括常用标签、布局方式、样式应用等&#xff1f; JavaScript深入理解&#xff1a;如何深入理解JavaScript语言特性&#xff0c;包括变量类型、函数、闭包、异步编程等&#xff1f; 前端框架学习&#xff1a;如…

【读书笔记】网空态势感知理论与模型(七)

通过网络级对象依赖关系揭示0Day攻击路径 1. 研究动机 0Day攻击是攻击者和防御者之间信息不对称的结果。赛门铁克研究人员认为&#xff0c;典型的0Day攻击平均隐藏312天才会被觉察。 受到SKRM模型启发&#xff0c;Patrol系统以全局视野来调查在某一个路径上的0Day攻击行为。从…

思科路由器忘记密码怎么重置

断电重启路由器&#xff0c;在开机过程中按下CtrlPause/break&#xff0c;或者只按下Pause/break&#xff08;没有测试&#xff09;&#xff0c;在PT&#xff08;Cisco Packet Tracert&#xff09;中则需要按CtrlC。路由器会进入rommon >模式。 切换到0x2142模式&#xff0…