Java快速排序算法、三路快排(Java算法和数据结构总结笔记)[7/20]

一、什么是快速排序算法

        快速排序的基本思想是选择一个基准元素(通常选择最后一个元素)将数组分割为两部分,一部分小于基准元素,一部分大于基准元素。

        然后递归地对两部分进行排序,直到整个数组有序。这个过程通过 partition 方法实现,它使用两个指针 i 和 j 来遍历数组,将小于基准元素的元素交换到左边,大于基准元素的元素交换到右边。

        最后,将基准元素放入正确的位置,并返回该位置作为划分点。快速排序的时间复杂度为O(nlogn)。

如下:快速排序算法的实现代码:

import java.util.Arrays;/*** @Description 快速排序算法**/
public class QuickSort {public static void main(String[] args) {int[] array = {0, 8, 9, 5, 6, 1, 4, 9, 3, 6, 3, 8, 2, 1, 7};quickSort(array, 0, array.length - 1);System.out.println("Sorted array: " + Arrays.toString(array));}// 递归函数用于执行快速排序public static void quickSort(int[] array, int low, int high) {if (low < high) {// 分割数组并获取基准元素的索引int pivotIndex = partition(array, low, high);// 递归排序左侧和右侧子数组quickSort(array, low, pivotIndex - 1);quickSort(array, pivotIndex + 1, high);}}// 函数用于分割数组并返回基准元素的索引public static int partition(int[] array, int low, int high) {// 选择基准元素(在本例中选择最后一个元素)int pivot = array[high];int i = low - 1;// 遍历数组for (int j = low; j < high; j++) {if (array[j] < pivot) {// 如果元素小于基准元素,则交换位置i++;swap(array, i, j);}}// 将基准元素放入正确的位置swap(array, i + 1, high);// 返回基准元素的索引return i + 1;}// 函数用于交换数组中的两个元素public static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}
}

排序输出:

上述代码中,就是快速排序算法的一种实现,总结来说就是:

1. 选择一个基准元素(通常是数组中的最后一个元素)。 
2. 将数组分割为两部分,一部分是小于基准元素的元素,另一部分是大于基准元素的元素。 
3. 对这两部分分别递归地应用快速排序算法,直到每个子数组都有序。 
4. 将所有子数组合并起来,得到最终排序后的数组。 
 
具体步骤实现: 
 
1. 选择基准元素。 
2. 设置两个指针,一个指向数组的起始位置(通常为low),另一个指向数组的结束位置(通常为high)。 
3. 从起始位置开始,向右移动指针,直到找到一个大于或等于基准元素的元素。 
4. 从结束位置开始,向左移动指针,直到找到一个小于或等于基准元素的元素。 
5. 如果左指针的位置小于右指针的位置,则交换这两个元素。 
6. 重复步骤3到5,直到左指针的位置大于或等于右指针的位置。 
7. 将基准元素与左指针所指向的元素进行交换,将基准元素放置在正确的位置。 
8. 递归地对基准元素左侧和右侧的子数组应用快速排序算法。 
 
快速排序的关键在于划分过程,即将数组分割为两部分。通过不断地划分和排序,最终实现整个数组的排序。快速排序的平均时间复杂度为O(nlogn),是一种高效的排序算法。

二、快速排序算法和三路快排的关系

        快速排序算法和三路快速排序算法都是基于快速排序思想的排序算法,它们之间的关系是三路快速排序算法是对快速排序算法的一种改进和优化。 
 
        快速排序算法通过选择一个基准元素,将数组分割为两部分,一部分是小于基准元素的元素,另一部分是大于基准元素的元素。然后递归地对这两部分进行排序,直到整个数组有序。 
 
        而三路快速排序算法在快速排序的基础上进行了改进。它通过选择两个基准元素,将数组划分为三部分:小于第一个基准元素、等于第一个基准元素、大于第一个基准元素的元素。然后递归地对小于和大于基准元素的两部分进行排序,而不需要再对等于基准元素的部分进行排序,因为它们已经在正确的位置上。 
 
三路快速排序算法在处理包含大量重复元素的数组时表现更好,因为它能够更有效地处理重复元素,减少了不必要的比较和交换操作。相比于快速排序算法,三路快速排序算法的时间复杂度仍然是O(nlogn),但在某些情况下,它的性能更好。 
 
总的来说,三路快速排序算法是对快速排序算法的改进,通过减少重复元素的比较和交换操作,提高了排序的效率。

三、三路快排代码实现

/*** @Description 三路快排**/
public class ThreeWayQuickSort {public static void main(String[] args) {int[] array = {9, 8, 5, 9, 2, 9, 1, 2, 3, 4, 6, 8, 4, 7};quickSort(array, 0, array.length - 1);System.out.println("排序后的数组:");for (int num : array) {System.out.print(num + " ");}}// 三路快速排序算法public static void quickSort(int[] array, int low, int high) {if (low < high) {// 将数组划分为三部分,并返回等于pivot值的范围int[] range = partition(array, low, high);// 递归地对小于pivot和大于pivot的部分进行排序quickSort(array, low, range[0] - 1);quickSort(array, range[1] + 1, high);}}// 划分数组为三部分的函数public static int[] partition(int[] array, int low, int high) {int pivot = array[low]; // 选择第一个元素作为pivotint lt = low; // 初始化lt指针指向lowint gt = high; // 初始化gt指针指向highint i = low + 1; // 初始化i指针指向low的下一个位置while (i <= gt) {if (array[i] < pivot) {swap(array, i, lt);i++;lt++;} else if (array[i] > pivot) {swap(array, i, gt);gt--;} else {i++;}}// 返回等于pivot值的范围int[] range = {lt, gt};return range;}// 交换数组中两个元素的函数public static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}
}

排序输出:

三路快速排序算法是一种高效的排序算法,它通过将数组划分为三个部分来进行排序:

小于pivot的部分、等于pivot的部分和大于pivot的部分。

下面是三路快速排序算法的实现思路步骤总结: 
 
1. 选择一个pivot元素(通常选择数组的第一个元素)。 
2. 初始化三个指针:lt指向数组的起始位置,gt指向数组的结束位置,i指向数组的起始位置的下一个位置。 
3. 从i开始遍历数组,比较当前元素与pivot的大小关系: 
   - 如果当前元素小于pivot,将它与lt指针指向的元素交换,并将lt和i指针都向右移动一位。 
   - 如果当前元素大于pivot,将它与gt指针指向的元素交换,并将gt指针向左移动一位。 
   - 如果当前元素等于pivot,将i指针向右移动一位。 
4. 重复步骤3,直到i指针遍历完整个数组。 
5. 最终,数组将被划分为三个部分:小于pivot的部分、等于pivot的部分和大于pivot的部分。 
6. 递归地对小于pivot和大于pivot的部分进行三路快速排序。 
 
三路快排算法通过将相等的元素放在中间,这样就避免了重复比较和交换的过程,从而提高了排序的效率。

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

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

相关文章

浅谈前端自定义VectorGrid矢量瓦片样式

目录 前言 一、VectorGrid相关API介绍 1、VectorGrid 2、 LayerStyles样式详解 二、样式自动配置 1、页面定义 2、地图及PBF瓦片引入 3、矢量瓦片样式定义 4、鼠标事件交互 三、最终效果 1、自定义样式展示 2、鼠标交互 总结 前言 在上一篇博客中&#xff0c;详细讲…

C#完成XML文档节点的自动计算功能

一个项目涉及XML文档中节点的自动计算&#xff0c;就是XML文档的每个节点都参与运算&#xff0c;要求&#xff1a; ⑴如果节点有计算公式则按照计算公式进行&#xff1b; ⑵如果节点没有计算公式则该节点的值就是所有子节点的值之和&#xff1b; ⑶节点有4种类型&#xff0c;计…

数据结构——B树

文章目录 B树1. 概念2. B树插入分析3.插入过程4. B树插入实现5.B树验证6. B树性能分析7.B树&B*树8. 小结9. B树的运用MyISAMInnoDB 10. 总结 B树 可以用于查询的数据结构非常的多&#xff0c;比如说二插搜索树、平衡树、哈希表、位图、布隆过滤器&#xff0c;但如果需要存…

【JavaEE】实现简单博客系统-前端部分

文件目录&#xff1a; 展示&#xff1a; blog_list.html: <!DOCTYPE html> <html lang"cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…

警告:未配置spring boot 配置注解处理器

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 问题 我再使用ConfigurationProperties(prefix “redisson”)去加载配置文件中的属性的时候&#xff0c;发现idea有个警告 并且配…

[BUUCTF NewStar 2023] week5 Crypto/pwn

最后一周几个有难度的题 Crypto last_signin 也是个板子题&#xff0c;不过有些人存的板子没到&#xff0c;所以感觉有难度&#xff0c;毕竟这板子也不是咱自己能写出来的。 给了部分p, p是1024位给了922-101位差两头。 from Crypto.Util.number import * flag b?e 655…

小菜React

1、Unterminated regular expression literal, 对于函数就写.ts&#xff0c;有dom元素就写.tsx 2、 The requested module /src/components/setup.tsx?t1699255799463 does not provide an export named Father export default useStore默认导出的钩子&#xff0c;组件引入的…

Kafka(二)消息系统设计

文章目录 前言整体设计时序图时序图解释 最后 前言 当多个系统之间通过Kafka来解耦时&#xff0c;在系统设计初期&#xff0c;基本的要求都是相似的&#xff0c;只不过是消费消息时的业务逻辑可能不同。 本文以业务系统和邮件系统解耦作为示例。业务系统需要发送邮件时&#…

【数据结构】树与二叉树(三):二叉树的定义、特点、性质及相关证明

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉…

骨骼动画详解

【物体怎么样是在动】 当物体的位置、朝向、大小即Transform有任意一者发生变化时&#xff0c;物体在动。 但变化要达到一定的幅度时&#xff0c;我们会看到物体在动&#xff0c;幅度是多少却决于我们看这个物体的距离、方向&#xff0c;物体的朝向等因素。 这里说的幅度是指…

mysql 存储引擎

存储引擎 在MySQL中&#xff0c;数据用各种不同的技术存储在文件中&#xff0c;每一种技术都使用的是不同的存储机制、索引技巧、锁定水平以及最终提供的不同的功能和能力&#xff0c;这些就是我们说的存储引擎 功能 1、MySQL将数据存储在文件系统中的一种方式和格式 2、存储…

【LVS实战】03 LVS负载均衡-DR模式实验

本文介绍&#xff0c;如何通过ipvsadm配置负载均衡&#xff0c;并且转发模式为DR直接路由模式 一、网络拓扑 如下图&#xff1a; LVS负载均衡的机器&#xff0c;配置了一个VIP&#xff1a;10.1.0.7 二、前置准备 每台机器关闭防火墙 systemctl stop firewalldRS装好ngin…

如何用 GPT-4 全模式(All Tools)帮你高效学习和工作?

「十项全能」的 ChatGPT &#xff0c;用起来感受如何&#xff1f; 之前&#xff0c;作为 ChatGPT Plus 用户&#xff0c;如果你集齐下面这五个模式&#xff0c;就会成为别人羡慕的对象。 但现在&#xff0c;人们更加期盼的&#xff0c;是下面这个提示的出现&#xff1a; 这个提…

ZZ038 物联网应用与服务赛题第I套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;I卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用的各类软件工…

http中的Content-Type类型

浏览器的Content-Type 最近在做web端下载的时候需要给前端返回一个二进制的流&#xff0c;需要在请求头中设置一个 writer.Header().Set("Content-Type", "application/octet-stream")那么http中的Content-Type有具体有哪些呢&#xff1f;他们具体的使用场…

超详细的wheel轮子下载和.whl安装

wheel安装 pip安装失败问题 基于Anaconda进行 pip install ,报如下 但基于此路径下安装.whl文件时候&#xff0c;会报如下 通过在可借鉴的博客上查找相关原因&#xff0c;发现原来是因为版本没有匹配的问题&#xff0c;基于此问题以及博客中的解决方案&#xff0c;进行亲测…

Pandas练手项目

一、chipotle tsv 数据集&#xff1a;chipotle.tsv-数据集 代码&#xff1a;https://download.csdn.net/download/Albert233333/88508819 1 导入数据 # order_id这一列相同的数字表示 一个消费者同一次进行的交易 # 表格中的每一行表示 用户一次购买的某一个品类 购买的数量…

1、Sentinel基本应用限流规则(1)

Sentinel基本应用&限流规则 1.1 概述与作用 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。缓存、降级和限流是保护微服务系统运行稳定性的三大利器。 缓存&#xff1a;提升系统访问速度和增大系统能处理的容量 降级&#xff1a;当服务出问题或者影…

12 款小众宝藏AI工具,90% 的开发者不了解

AI工具的发展一日千里&#xff0c;了解这些AI工具的功能以及它们如何提高开发过程中的效率和创新&#xff0c;变得尤为重要&#xff0c;这里分享了 12个宝藏的人工智能和低代码工具&#xff0c;希望对大家的工作与学习有所帮助。 1.Pieces for Developers 网址&#xff1a;ht…

Technology Strategy Pattern 学习笔记5 -Creating the Strategy-Department Context

Creating the Strategy-Department Context 1 situations This pattern helps you organize your thoughts, and consider the department holistically in the following situations 1.1 •Aligning teams around a vision, especially a new direction 1.2 •Setting up a …