Java学习手册:(数据结构与算法-排序)快速排序

【排序算法】快速排序原理及Java实现 快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动次数。同时采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,其原理如下: 阅读详情

算法思想:

设两个指针i和j,它的初值分别为left和right。首先将基准记录r[left]移动至变量x中,使r[left]即r[i]相当于空单元,然后反复进行如下两个扫描过程,直至i和j相遇。

(1)j从右向左扫描,直到r[j]<x时,将人r[j]移至r[i],此时r[j]相当于空单元。

(2)i从左往右扫描,直到r[i]>x,将r[i]移至空单元r[j],此时r[i]相当于空单元。

当i和j相遇时,r[i](或r[j])相当于空单元,且r[i]的左边所记录的关键字均不大于基准记录的关键字,而r[i]右边所记录的关键字均不小于基准记录的关键字。

最后,将基准记录移至r[i]中,就完成了一次划分过程。

 

例子:举个栗子:对5,3,8,6,4这个无序序列进行快速排序,思路是右指针找比基准数小的,左指针找比基准数大的,交换之。
5,3,8,6,4 用5作为比较的基准,最终会把比5小的移动到5的左边,比5大的移动到5的右边。
5,3,8,6,4 首先设置i,j两个指针分别指向两端,j指针先扫描(思考一下为什么?)4比5小停止。然后i扫描,8比5大停止。交换i,j位置。
5,3,4,6,8 然后j指针再扫描,这时j扫描4时两指针相遇。停止。然后交换4和基准数。
4,3,5,6,8 一次划分后达到了左边比5小,右边比5大的目的。之后对左右子序列递归排序,最终得到有序序列。
上面留下来了一个问题为什么一定要j指针先动呢?首先这也不是绝对的,这取决于基准数的位置,因为在最后两个指针相遇的时候,要交换基准数到相遇的位置。一般选取第一个数作为基准数,那么就是在左边,所以最后相遇的数要和基准数交换,那么相遇的数一定要比基准数小。所以j指针先移动才能先找到比基准数小的数。
快速排序是不稳定的,其时间平均时间复杂度是O(nlgn)。

package com.haobi;
/*
 * 快速排序
 */
public class QuickSort {
	public static void sort(int[] array, int low, int high) {
		int i,j;
		int index;
		if(low>=high) {
			return;
		}
		i = low;//小指针
		j = high;//大指针
		index = array[i];//基准
		while(i<j) {//直至i,j相遇,跳出循环
			while(i<j&&array[j] >= index)//直至出现小于基准的数出现,跳出循环
				j--;//大指针左移
			if(i<j)
				array[i++] = array[j];//将该数存入基准中,该数变为新的基准
			while(i<j&&array[i]<index)//直至出现大于基准的数出现,跳出循环
				i++;//小指针大移
			if(i<j)
				array[j--] = array[i];//将该数存入基准中,该数变为新的基准
		}
		array[i] = index;//i,j相遇,基准记录存入array[i]中
		sort(array,low,i-1);//左边递归快排
		sort(array,i+1,high);//右边递归快排
	}
	public static void quickSort(int[] array) {
		sort(array,0,array.length-1);
	}
	public static void main(String[] args) {
		int[] array = {45,53,18,36,72,30,48,93,15};
		quickSort(array);
		for(int i=0;i<array.length;i++) {
			System.out.print(array[i]+" ");
		}
	}
}

程序输出结果如下:

15 18 30 36 45 48 53 72 93 

Java经典算法之快速排序算法 快速排序是一种分治法(Divide and Conquer)的排序算法,由英国计算机科学家Tony Hoare于1960年提出。其基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有元素均比另一部分的元素小,然后分别对这两部分继续进行排序,最终达到整个序列有序的效果。 阅读详情

相关推荐

大话数据结构系列之快速排序算法

文章目录实现思路重点知识代码实现优化策略算法比较与各位共勉 实现思路 1、属于冒泡排序的升级版,都是通过不断的比较和移动交换来实现排序,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动交换次数。 2、通过一趟排序将待记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这...

威少(微笑) 4162

【刷题】Java日常刷题1

给出一个数组,一个在此基础上被操作过的数组,找出被操作过的最长的非递减连续序列。这道题最开始写就被给的样例迷惑了,给出的样例都是被操作过出现非递减序列的片段,因此我就直接去看第二个数组,找它的最长非递减连续序列了。但是题意中还有提到一层意思,如果找出的非递减序列没被操作过,就不能作为答案。所以不能但看第二个数组,还要比对第一个数组找出被操作的地方,再找其中的最长非递减序列。

m0_62811051的博客 1028

JAVA 数据结构与算法之————快速排序

JAVA 数据结构与算法之————快速排序 快速排序: /* * 快速排序的时间复杂度为O(nlogn), 空间复杂度为O(logn) * */ public class QuickSort<E extends Comparable> { Swap<E> s = new Swap<>(); /*一轮排序*/ public int sor...

qq_36007633的博客 633

天津理工C期末试题语言,天津理工大学C语言上机-题库.doc

.Word 资料1.键盘上输入n个数,输出最大值最小值#includevoid main(){int array[50];int i,n;printf("please input numbers , input '0' to stop\n");for(i=0;i{scanf("%d",&array[i]);}for(i=0;iif(array[0]>=array[i+1])array...

weixin_34394265的博客 844

MAX3232芯片引脚功能详解与外围电路设计避坑指南(从电荷泵到静电防护)

本文详细解析了MAX3232芯片的引脚功能与外围电路设计,重点介绍了其电荷泵架构和RS232通信接口的应用。通过实际案例和参数对比,提供了电路设计中的常见问题解决方案和静电防护建议,帮助工程师优化工业控制与嵌入式系统中的通信可靠性。

weixin_30596165的博客 434

pikachu靶场: 暴力破解第四关(token防爆破)

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 同时将此 Token 返回给客户端。此外,Token 是有时效的,一段时间之后或下一次请求时用户需要重新验证。

X_shiguang的博客 1720

玩转算法面试:(三)LeetCode数组类问题

数组中的问题其实最常见。 排序:选择排序;插入排序;归并排序;快速排序 查找:二分查找法 数据结构:栈;队列;堆 1、二分查找法 template<typename T> int binarySearch( T arr[], int n, T target ) { int l = 0, r = n-1; // 在[l...r]的范围里寻找target:前闭后闭 ...

coffee0218的博客 439

DAX Studio--导出PowerBi数据---(不使用复制表如何快速导出csv文件 / 如何导出百万级/千万级乃至亿级的数据量)多图预警!

多图预警! 1、打开Dax 点击Connect 2、在这里选择正在打开的PowerBi文件,点击Contect 3、选择导出方式--File F、输入指令(输入 EVALUATE ' )单引号可以进行快速提示 5、点击Run 6、选择文件路径,以及保存类型等(一般情况下,我们常用的类型是 txt 或者 第一种 UTF-8 的csv 文件),点击保存即可,稍等片刻,导出完成! 7、导出完成,我这里总计是39W 行的数据量,约20+ 秒完成 ...

STR_Liang的博客 8159

15周 项目1

问题及描述:       /* 烟台大学计算机与控制工程学院 姓名:范宝磊 日期:2017.12.10 文件名称:y5962017 问题描述:用序列{57, 40, 38, 11, 13, 34, 48, 75, 6, 19, 9, 7}作为测试数据, 运行并本周视频中所讲过的算法对应 程序,观察运行结果并深刻领会算法的思路和实现方法: (3)冒泡排序;(4)快速排序

小漠溪 380

支付宝支付(三):周期扣款实现注意细节

一、周期扣款实现说明 1、官方文档入口:https://opendocs.alipay.com/open/20190319114403226822/intro 2、根据官方文档说明,周期扣款有两种方式:先签约后代扣场景和支付后签约场景 3、周期扣款接入问题文档: a>https://opendocs.alipay.com/support/01rg24 b>https://opensupport.alipay.com/support/knowledge/50249/20160248753

新鲜雾霾的博客 5702

【计算机科学导论实验】加法图灵机模拟 题解

本文提供计算机科学导论课程“图灵机加法器”实验的个人思路,仅供参考。

Chavapa's blog 2578

java 算法之快速排序

1、快速排序是一种比较高效的排序算法,采用“分而治之”的思想,通过多次比较和交换来实现排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分进行排序使得其中一部分所有数据比另一部分都要小,然后继续递归排序这两部分,最终实现所有数据有序。 2、快速排序图 3、Java 代码实现快速排序 public static void main(String[] args) { int[] arry = {9,8,7,6,5,4,3,2,1}; quickSort(arry,0, a

weixin_54951878的博客 1万+

一文读懂无人机AI识别算法,原理、技术、应用

本文详细介绍了无人机识别算法的工作原理、技术优势以及在多个行业的应用前景,展现了其在提升安全监控、资源管理和应急响应中的关键作用。尽管无人机识别算法在多个领域展现出巨大潜力,但仍面临技术挑战,如算法的准确性、数据的实时处理能力以及对复杂环境的适应性。4. 消防与城市管理: 无人机识别算法在消防和城市管理中的应用,为相关部门提供了及时的信息支持,提升了应急处置能力和城市管理水平。1. 公安监控: 无人机识别算法在公安领域的应用,可以实时识别犯罪嫌疑人和违法行为,有效提升城市治安管理的智能化水平。

foiadrone的博客 1849

Java数据结构与算法-快速排序与归并排序

快速排序 1. 快速排序原理 2. 快排的递归实现 3. 代码 4. 测试排序的速度 1,排序原理 快速排序(Quicksort)是对冒泡排序的一种改进。 基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 2,快速排序的示意图 ...

大美妞的博客 3981

Docker一键部署NextCloud+OnlyOffice:打造企业级私有云办公环境(含HTTPS配置)

本文详细介绍了如何使用Docker Compose一键部署NextCloud与OnlyOffice,构建安全、高效的企业级私有云办公平台。内容涵盖从架构设计、Docker编排配置、HTTPS证书自动化管理,到系统初始化、性能优化及高级功能扩展的全栈实战指南,帮助企业实现数据自主可控与高效的在线文档编辑协作。

Apple的专栏 1241

YOLOv11 改进 - 主干网络| 清华大学CloFormer AttnConv :利用共享权重和上下文感知权重增强局部感知,注意力机制与卷积的完美融合

本文介绍了轻量级视觉变换器CloFormer及其核心模块AttnConv在YOLOv11中的结合应用。为解决视觉变换器缩小到移动设备友好尺寸时性能下降的问题,提出CloFormer,其引入AttnConv操作符。AttnConv融合共享权重和上下文感知权重,先通过深度卷积提取局部表示,再用上下文感知权重增强特征,还结合传统注意力减少FLOPs,使模型感知高频和低频信息。我们将AttnConv集成进YOLOv11,实验表明,CloFormer在多个视觉任务中表现优越,改进后的YOLOv11也取得了良好实验结果

魔改工程师的博客 989

java实现快速排序算法

快速排序 1、算法思想 快速排序是由冒泡排序改进而得到的,是一种分区交换排序方法。思想如下: 一趟快速排序采用从两头向中间扫描的方法,同时交换与基准记录逆序的记录。 (1)在待排序的N个记录中任取一个元素(通常取第一个记录)作为基准,称为基准记录; (2)定义两个索引 left 和 right 分别表示“首索引” 和 “尾索引”,key 表示“基准值”; (3)首先,尾索引向前扫描,直到找到比基准值小的记录(left != righ),并替换首索引对应的值; (4)然后,首索引向后扫描,直到找到比基准值大于

EatingSoilLang 6752

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java学习手册:数据结构与算法汇总

数据结构与算法程序题汇总如下:(不断更新中) 1、PAT(Basic Level)Practise-----1001 2、Java学习手册:(数据结构与算法-链表)如何实现单链表的增删操作? 3、Java学习手册:(数据结构与算法-链表)如何实现单链表排序? 4、Java学习手册:(数据结构与算法-链表)如何从链表中删除重复元素? 5、Java学习手册:(数据结构与算法-链表)如何找出单链表中的倒...

浩比的专栏 3248

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java 数据结构与算法 ——快速排序法

java 数据结构与算法 ——快速排序法

weixin_59796310的博客 2797

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数据结构与算法之快速排序

(Quick Sort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

2401_83641443的博客 694

Java玩转《啊哈算法》排序之快速排序

搭嘎好!本人最近看的《啊哈算法》这本书写的确实不错,生动形象,在保持算法讲解准确性的同时又不失趣味性。但对我来说,稍显遗憾的是,书籍代码是c语言,而不是本人常用的Java。那就弥补遗憾,说干就干,把这本书的示例语言用java给翻译一遍!!!于是就有了本篇博客,这是第三篇博客,主要讲解快速排序。

Qizhi_Hu的博客 1336

Java 快速排序算法

简介 上一章我们学习了 Java 希尔排序算法,这一章,我们来学习快速排序算法,so,多了不说,继续老规矩,学习内容如下: 1、快速排序的定义 2、快速排序的思路 3、代码实现 1.快速排序的定义 快速排序的基本思想:通过一趟排序将待排记录分隔成 独立的两部分 ,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 2.快速排序的思路 快速排序使用分治法,把一个串(list)分为两个子串(child-list)具体算法描述如下: 从数列中挑出一个元素,

ZengTao 2296

数据结构-排序算法之快速排序

排序算法之快速排序1-快速排序的基本思想2-快速排序的过程图解第一次排序过程第二次分治排序过程子列表1的排序过程子列表2的排序过程子列表2-1的分治排序过程排序结果3-Java代码实现4-例题题目描述结题思路代码编写     快速排序属于交换排序的一种,其基本思想是基于分治法的。其算法时间复杂度为O(log2N),堪称是所有内部排序算法中平均性能最优的排序算法。。 1-快速排序的基本思想     从待排序表L:【0…n】中任取

席木木的博客 3165

数据结构与算法-快速排序

快速排序(Quick Sort)是由英国计算机科学家C.A.R. Hoare在1960年提出的一种分治策略的排序算法。它采用“分而治之”的思想,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后再分别对这两部分记录继续进行排序,以达到整个序列有序的目的。尽管快速排序存在一定的局限性,但它凭借其较高的平均效率和原地排序特性,在众多实际场景中得到广泛应用,尤其是在大数据处理领域。

m0_62988332的博客 1251

【Java数据结构与算法】快速排序

快速排序介绍及其实现

lolly1023的博客 637
上一篇: Java学习手册:(数据结构与算法-排序)冒泡排序
下一篇: Java学习手册:(数据结构与算法-排序)选择排序
浩比浩比
博客等级 码龄12年 395粉丝 202原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值