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的部分进行三路快速排序。
三路快排算法通过将相等的元素放在中间,这样就避免了重复比较和交换的过程,从而提高了排序的效率。
相关文章:
Java快速排序算法、三路快排(Java算法和数据结构总结笔记)[7/20]
一、什么是快速排序算法 快速排序的基本思想是选择一个基准元素(通常选择最后一个元素)将数组分割为两部分,一部分小于基准元素,一部分大于基准元素。 然后递归地对两部分进行排序,直到整个数组有序。这个过程通过 par…...
【React】05.JSX语法使用上的细节
水水水水水...
LeetCode 1759. 统计同质子字符串的数目【字符串】1490
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
FPGA UDP RGMII 千兆以太网(2)IDDR
1 xilinx原语 在 7 系列 FPGA 中实现 RGMII 接口需要借助 5 种原语,分别是:IDDR、ODDR、IDELAYE2、ODELAYE2(A7 中没有)、IDELAYCTRL。其中,IDDR和ODDR分别是输入和输出的双边沿寄存器,位于IOB中。IDELAYE2和ODELAYE2,分别用于控制 IO 口输入和输出延时。同时,IDELAYE2 …...
chrome安装vue devtools
不能访问应用商店 如果可以访问应用商店可以往下看 插件源代码 选择shell-chrome,这是官方的插件源码 下载源代码打包 参考教程 点击扩展按钮->管理扩展程序->打开开发者模式->把crx文件拖拽进去即可 可以访问chrome应用商店 插件地址 官方文档地址 选…...
【Docker】iptables命令的使用
iptables是一个非常强大的Linux防火墙工具,你可以使用它来控制网络流量的访问和转发。 前面已经学习了iptables的基本原理,四表五链的基本概念,也已经安装好了iptables,下面我们主要学习iptables命令的基本使用。 可以使用iptable…...
Flex bison 学习好代码
计算机的重要课程编译原理很难学吧, 但是要会用flex &bison的话,容易理解一些。 有些好的项目可以帮助我们,比如 https://github.com/jgarzik/sqlfun 可以帮我们,下载 下来。 在cygwin 下面或者linux 运行: …...
学习Nginx配置
1.下载地址 官网地址:NGINX - 免费试用、软件下载、产品定价 (nginx-cn.net) 我这边选择NGINX 开源版 nginx: download 2.nginx的基本配置 配置文件语法 配置文件组成:注释行,指令块配置项和一系列指令配置项组成。 单个指令组成&#x…...
怎么批量获取文件名,并保存到excel?
怎么批量获取文件名?什么叫批量获取文件名,其实也非常好理解,就是面对大量文件是可以一次性的获取所有文件名称,这项技术的应用也是非常常见的,为什么这么说呢?现在很多的文档管理人员或者公司的文员&#…...
数据结构: unordered_map与unordered_set
目录 1.框架 2.结构 unordered_map unordered_set 3.对HashTable的修改 更改模板参数 4.增加迭代器 a.结构 b.运算符重载 c.HashTable封装迭代器 d.unordered_map与unordered_set的迭代器 1.框架 1.复用HashTable ~~> 增加模板参数KeyOfT 来获取 Key值 unorder…...
WebDAV之π-Disk派盘 + PassStore
大家常用的qq,手机微信,新浪微博等。假如各个网址都设成同样的帐号和登陆密码,一旦某一帐户泄漏了,别的平台上的账户密码都有被撞库攻击的风险。在不一样的站点设定不一样的高韧性登陆密码才算是最安全可靠的确保,殊不知这般繁多的帐户密码是难以记得的。因而,有着一款安…...
OpenCV实现手势虚拟拖拽
前言: Hello大家好,我是Dream。 今天来学习一下如何使用OpenCV实现手势虚拟拖拽,欢迎大家一起前来探讨学习~ 一、主要步骤及库的功能介绍 1.主要步骤 要实现本次实验,主要步骤如下: 导入OpenCV库。通过OpenCV读取摄…...
深圳市宝安区委常委、宣传部部长周学良一行莅临联诚发考察调研
11月9日,深圳市宝安区组织开展主题教育“大走访、大座谈、大起底”行动和调查研究、“基层调研服务日”活动。当日上午,区委常委、宣传部部长周学良率调研组莅临联诚发LCF总部考察调研。区委宣传部副部长孙箫韵,区文化广电旅游体育局党组成员…...
Presentation Prompter 5.4.2(mac屏幕提词器)
Presentation Prompter是一款演讲辅助屏幕提词器软件,旨在帮助演讲者在公共演讲、主持活动或录制视频时更加流畅地进行演讲。以下是Presentation Prompter的一些特色功能: 提供滚动或分页显示:可以将演讲稿以滚动或分页的形式显示在屏幕上&a…...
9 网关的作用
1、总结: 1.如果离开本局域网,就需要经过网关,网关是路由器的一个网口。 2.路由器是一个三层设备,里面有如何寻找下一跳的规则 3.经过路由器之后 MAC 头要变,如果 IP 不变,相当于不换护照的欧洲旅游&#…...
计算机网络实验
计算机网络实验 使用软件PT7.0按照上面的拓扑结构建立网络,进行合理配置,使得所有计算机之间能够互相通信。并且修改各交换机的系统名称为:学号_编号,如你的学号为123,交换机Switch0的编号为0,则系统名称为…...
九凌网络分享外贸快车实现迅速出口的目标
随着全球化进程的不断加速,外贸行业也越来越繁荣。但如何在这个竞争激烈的市场中迅速出口,成为了很多外贸企业家们面临的难题。为此,很多企业开始寻求新的帮助,其中一种办法就是通过专业的外贸快车来提高自己的出口速度。九凌网络…...
分享66个Python管理系统源代码总有一个是你想要的
分享66个Python管理系统源代码总有一个是你想要的 源码下载链接:https://pan.baidu.com/s/1FGmE9Q_NE1-cjjoxU540BQ?pwd8888 提取码:8888 项目名称 automobile-sales-management-system汽车销售管理系统 Python Vue BNUZ教务系统认证爬虫Python语言…...
python 删除特定字符所在行
嗨喽,大家好呀~这里是爱看美女的茜茜呐 查询文件中含有特殊字符串的行 #!/usr/bin/python # -*- coding:utf-8 -*- import re file1 open(test.txt,r) istxt re.compile(r.*if.*,re.I) for line in file1.readlines():line line.strip()ifstr re.findall(istxt…...
邮箱哪家强?哪个牌子邮箱好用
邮箱在国内外使用情况不太一样,国内一般都是工作中需要用邮箱,直接使用公司发的企业邮箱就可以了,个人一般自己需要使用邮箱频率比较少,大多是用来注册其他平台信息,接受验证码、电子发票等等,使用不频繁。…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
