快速排序的思路分析及代码实现

快速排序的基本思想(图文详解) 快速排序算法通过多次比较和交换来实现排序,其排序流程如下:(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。(4)重复上述过程,可以看出,这是一个递归定义。 阅读详情

快速排序的思路分析及代码实现

快排介绍

快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

思路分析

它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
在这里插入图片描述

代码实现

package com.sort;

import java.util.Arrays;

public class QuickSort {

	public static void main(String[] args) {
		int[] arr = { -9, 78, 0, 23, -567, 70, -1, 900, 4561 };
		quickSort(arr, 0, arr.length - 1);
		System.out.println("arr=" + Arrays.toString(arr));
	}
	
	public static void quickSort(int[] arr, int left, int right) {
		int l = left;// 左下标
		int r = right;// 右下标
		// pivot 中轴值
		int pivot = arr[(left + right) / 2];
		int temp = 0;// 临时变量,交换时使用
		// while循环的目的是让比pivot值小放到左边
		// 比pivot值大的放到右边
		while (l < r) {
			// 在pivot的左边一直找,找到大于等于pivot的值才退出
			while (arr[l] < pivot) {
				l += 1;
			}
			// 在pivot的右边一直找,找到小于等于pivot的值才退出
			while (arr[r] > pivot) {
				r -= 1;
			}
			// 如果l>=r说明pivot的左右两边的值,已经按照左边全是小于等于pivot的值,右边全是大于等于pivot的值
			if (l >= r) {
				break;
			}
			// 交换
			temp = arr[l];
			arr[l] = arr[r];
			arr[r] = temp;
			// 如果交换完后,发现arr[l]==pivot 相等r--,前移
			if (arr[l] == pivot) {
				r -= 1;
			}
			// 如果交换完后,发现arr[r]==pivot 相等l++,前移
			if (arr[r] == pivot) {
				l += 1;
			}
		}
		// 判断,如果l==r, 必须l++,r--,否则会出现栈溢出
		if (l == r) {
			l += 1;
			r -= 1;
		}
		// 向左递归
		if (left < r) {
			quickSort(arr, left, r);
		}
		// 向右递归
		if (right > l) {
			quickSort(arr, l, right);
		}
	}
}
025.快速排序思路分析和代码实现 <!-- TOC --> <ul> <li><a href="#1-%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E6%95%B4%E4%BD%93%E5%88%86%E 阅读详情

相关推荐

JavaScript实现快速排序算法

JavaScript实现经典排序算法—快排 快速排序算法的性能比之前的冒泡、选择排序都要好,和归并排序一样,是一个可以用于实战的算法,听说chrome用的就是快排 又听说前端面试会考,那你实现一个快排吧! 一、快速排序的算法思路 还是在这里看一下快排是啥意思 快速排序算法动图 1、快速排序的特点就是随机设置一个基准点,比如是数组的第一个元素,然后数组的其他元素就跟这个基准线进行对比,比基准线大的放在左边,比基准线小的放在右边 2、再设置一个基准线,再这样小的放左边,大的放右边,递归。 二、编码实现 详细分析

Yolanda_NuoNuo的专栏 2356

快速排序三种思路详解!

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。(其时间复杂度最优为N*logN,空间复杂度最优为lonN,这里就不予证明了!过程相当复杂!

weixin_71276184的博客 4524

iOS面试题大全(附带答案)

C语言相关面试题 1.static有什么用途? 答案:在C语言中,static主要定义全局静态变量,定义局部静态变量,定义静态函数。 static 属于静态变量,使用它修饰的变量生命周期是整个源程序。 @1.在函数体内的 static 变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; @2.在模块内的 static 全局变量可以被模块内所有函数访问,但不能被模块外其它函数访问; @3.在模块内的 static 函数只被这一模块内的其它函数调用,这个函数的使用范围被限

IOSNF的博客 2423

快速排序(代码+详细分析)

基本思想: 任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。 图解: 假设有下列一组数据,此时规定每次分割选定当前序列最右侧的数值为基准值,那么第一次的基准值为3,分割为两个子序列后,在分别选定子序列最右侧的数据为基准值,再重复上述过程,就完成了排序。 代码: 分析上述过程,需要一个将数组进行分割的函数,我们只需要想

Enthusiastic_boy的博客 1万+

zabbix5+dify+ollama+deepseek+企业微信 本地部署实现故障智能分析

zabbix5告警信息deepseek自动分析

slc14211421的专栏 3070

全国30米分辨率逐年植被覆盖度(FVC)数据集

植被覆盖度是描述地表植被的重要参数与生态环境的基本指标,在大气圈、土壤圈、水圈和生物圈中都占据着重要的地位,区域及全球范围的植被覆盖度估算对植被及相关领域的研究具有重要意义。往往参照《土壤侵蚀分类分级标准》,将植被覆盖度划分为4个等级:<30%为低覆盖度、30%—45%为中低覆盖度、45%—60%为中覆盖度、>60%为高覆盖度。本数据集包括1986至2022年间,全国植被覆盖度数据,FVC范围值为0-1,数据为浮点型,GeoTIFF格式。NDVImax 和NDVImin分别为区域内最大和最小的NDVI值。

地球资源数据云的官方博客 1965

【算法】快速排序算法原理及实现

快速排序算法原理及实现

互联网小阿祥 3547

uniapp(全端兼容) - 超详细接入百度统计功能,给uniapp全平台各端项目引入添加百度统计的插件统计流量详细的步骤教程(提供最新的百度统计源代码,详细的示例代码复制粘贴即可快速搞定!)

uniapp h5 app 使用加入接入百度统计,uniapp百度统计,uniapp详细引入百度统计的教程,uniapp接入百度统计,uniapp如何实现加入百度的统计代码,uniapp怎么植入百度统计详细教程,uniapp如何对接百度统计,uniapp百度统计不生效怎么办,uniapp使用百度统计不生效常见问题,uniapp引入百度统计后没有生效,uniapp h5网页接入百度统计代码后没有统计无效,uniapp最新接入使用百度统计功能,uniapp增加百度统计代码,uniapp app如何接入百度统计,

✅ 精选推荐文章 1万+

快排的三种方法

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

C_Rio的博客 5579

LeRobot — 基于 PyTorch 的真实世界机器人学习框架(一)- 核心框架模块解析

LeRobot 是一个开源的机器人学习框架,由 Hugging Face 开发,旨在降低机器人学的准入门槛。该框架提供完整的机器学习流程支持,包括数据采集、训练、评估和部署。核心模块涵盖数据集标准化、策略算法、硬件抽象和强化学习组件,采用模块化设计实现灵活扩展。通过集成 Hugging Face Hub,用户可以轻松共享数据集和预训练模型。LeRobot 特别注重真实世界的机器人应用,支持多种前沿算法如模仿学习、视觉语言动作模型等,并提供统一的硬件接口和仿真环境适配。

熊猫小妖的AI世界 170

wireshark提取视频数据之RTP包中提取H264和H265

本文主要描述从wireshark包数据中提取出H264和H265裸流数据方法,裸流通过RTP封包方式发送,从抓包中直接提取视频流数据,进而进行流媒体问题定位

技术控的笔记 17万+

快速排序(java)思路分析及代码实现

点击查看快速排序思路分析 快速排序核心代码: /** * @Title: quickSort * @Description: 快速排序 * @param nums 待排序数组 * @param left 数组最左边下标 * @param right 数组最右边下标 */ public static void quickSort(int nums[], int left, int right) { int temp =

278

测试用例设计工具大盘点:总有一款适合你

本文旨在帮助测试工程师、开发人员及团队管理者快速了解主流测试用例设计工具的特点、适用场景和选择逻辑。覆盖工具类型包括传统文档工具、开源管理工具、商业集成平台及新兴AI工具,范围涵盖中小团队到大型企业的不同需求。本文从“测试用例设计的痛点”切入,用生活案例解释核心概念;接着按“工具类型”分类盘点主流工具(附优缺点对比表);再通过“小团队/中大型团队/敏捷团队”等真实场景教你选工具;最后展望AI等未来趋势,帮你“一次学透,终身受用”。

项目管理的博客 1589

Java排序算法02:希尔排序法、快速排序法、思路分析、代码实现

文章目录4、希尔排序法 (不稳定)5、快速排序法 (不稳定) 4、希尔排序法 (不稳定) 希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 public class ShellSorting

阿星小天地 208

PyTorch深度学习实战(39)——少样本学习(Few-shot Learning)

小样本学习 (Few-shot Learning) 旨在解决在训练集中只有很少样本的情况下进行分类和推理的问题。在小样本学习中,我们希望通过利用已有的少量样本和先验知识来进行泛化,以便在面对新的、未见过的类别时能够做出准确的预测。这就要求模型能够从有限的训练样本中提取出有用的信息,并能够将这些信息应用到新类别的样本中去。在本节中,将介绍孪生、原型和关系网络的原理,并使用 PyTorch 实现孪生网络。

盼小辉丶的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

快速排序实战:揭秘数字王国探险——(含实现思路,代码,最好最坏时间复杂度分析过程)

《数字王国的探险家:快速排序的奇妙之旅》通过拟人化角色生动讲解了快速排序算法。故事主角小快在排序森林中向老树、分界精灵等角色学习快速排序的原理:使用分治法选取基准值,将数组分为两部分递归处理。文章详细分析了最优情况(O(nlogn))和最坏情况(O(n²))的时间复杂度,并提供了完整的C++实现代码。代码精灵展示了划分函数和递归排序的实现,编译巫师则逐行解析代码逻辑。最后强调基准选择的重要性,并建议采用随机化等优化策略。这场算法探险既有趣味性又具教学价值,让读者轻松掌握快速排序的核心思想。

大四在找工作,如果公司有需要的可以联系我13086825462@163.com 802

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

快速排序(动图演示 思路分析 实例代码Java 复杂度分析)

文章转载至https://www.cnblogs.com/l199616j/p/10597245.html 对快速排序的理解给了我很大的帮助,故保存于优快云 一、动图演示 动图以最后一个元素为基准元素排序 二、思路分析 快速排序的思想就是,选一个数作为基数(这里我选的是第一个数),大于这个基数的放到右边,小于这个基数的放到左边,等于这个基数的数可以放到左边或右边,看自己...

qq_41200112的博客 605

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

快速排序

快速排序1.代码实现2.思路总结 1.代码实现 #include <stdio.h> int partition(int *g,int left,int right) { int key = g[left]; while(left<right) { while(left<right && g[right] >=...

dengwodaer的博客 180

排序——快速排序(Quick sort)

概况 快速排序(Quick sort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。 算法思路 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快速排序算法通过多次比较和交换来实现排序,其排序流程如下: ......

努力中的老周的专栏 32万+

【leetcode练习·二叉树拓展】快速排序详解及应用

具体的细节看代码注释,建议自己动手实践。

Captain823Jack的博客 1293

排序算法——快速排序(二)

快速排序性能好坏关键取决于枢纽的选择,选的好在一众O(nlogn)复杂度的高级排序算法中快排是首屈一指的存在,选择不好甚至还比不上简单排序算法。插入排序。

wts327的博客 916

排序算法-----快速排序(非递归实现)

快速排序(Quicksort),计算机科学词汇,适用领域Pascal,C++等语言,是对冒泡排序算法的一种改进。 快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。

m0_73633088的博客 4405

十大排序算法之——快速排序算法(Java实现)及思路讲解

快速排序是一种非常高效的排序算法,其平均时间复杂度为O(n log n),并且由于原地排序的特性,它不需要额外的存储空间。快速排序的基本思想是:通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。另外,快速排序的空间复杂度是O(log n),这是因为递归调用需要使用栈空间,栈的深度在最坏情况下是O(n),但平均情况下是O(log n)。

一叶浮萍归大海的博客 1836

【排序】快速排序

思路分析: 快速排序采用双向查找的策略,每一趟选择当前所有子序列中的一个关键字作为枢纽轴,将子序列中比枢纽轴小的前移,比枢纽轴大的后移,当本趟所有子序列都被枢轴按上述规则划分完毕后将会得到新的一组更短的子序列,他们将成为下趟划分的初始序列集。 时间复杂度:最好情况(待排序列接近无序)时间复杂度为O(nlog2n),最坏情况(待排序列接近有序)时间复杂度为O(n2),平均时间复杂度为O(nlog...

428

【五一创作】排序篇:冒泡排序,快速排序的递归与非递归实现(C语言)

排序篇:冒泡排序,快速排序的递归与非递归实现(C语言)

2301_76269963的博客 2451

快速排序算法

本文介绍了快速排序的两种实现方法:覆盖法和交换法。覆盖法通过假想空位和赋值操作实现分区,将数组划分为左右两部分;交换法则通过元素交换调整位置。两种方法在分区目标、基准选择和递归逻辑上相同,但在核心操作、指针初始化和边界条件处理上存在差异。快速排序的时间复杂度为O(nlogn)(最优/平均)和O(n²)(最坏),空间复杂度为O(logn)(递归栈),是一种不稳定的原地排序算法。

2401_82472941的博客 1121
上一篇: 希尔排序思路分析及代码实现
下一篇: 归并排序思路分析及代码实现
lu_long
博客等级 码龄8年 11粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值