排序算法——快速排序

众数问题(分治方法解决) 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中最大的元素称为众数。给定一个n个自然数组成的多重集合S,设计算法求其众数和重数。 阅读详情

一、基本原理

选择一个基准数,通过一趟排序将比他小的数放在他左边,比他大的数放在他的右边。

  • 选择基准数,通常是数列的第一个元素;
  • 将比基准数小的数放在基准数左边,把比基准数大的数放在基准数的右边,所以基准数放在数列的中间;
  • 对“基准数左侧数列”和"基准数右侧数列"执行以上操作。

二、算法分析

以数组{6, 3, 8, 2, 9, 1}为例:
第一轮left = 0, right = 5,i = left, j = right,基准数p=6

  • j = 5:比较6和1,1<6,设置a[i++] = a[j],数组为:1, 3, 8, 2, 9, 1
  • i = 1:比较6和3,3<6,不交换位置;
  • i = 2:比较6和8,8>6,设置a[j++] = a[i],数组为:1, 3, 8, 2, 9, 8
  • j = 4:比较6和9,9>6,不交换位置;
  • j = 3:比较6和2,2>6,设置a[i++] = a[j],数组为:1, 3, 2, 2, 9, 8
    不满足i < j循环结束,设置a[i=3] = p,数组为:1, 3, 2, 6, 9, 8

第二轮left = 0, right = 2,i = left, j = right,基准数p=1
  • j = 2:比较2和1,1<2,不交换位置;
  • i = 1:比较3和1,1<3,不交换位置;
    不满足i < j循环结束,设置a[i=0] = p,数组为:1, 3, 2, 6, 9, 8

第三轮left = 0, right = -1,此轮无效,直接退出


第四轮left = 1, right = 2,i = left, j = right,基准数p=3
  • j = 2:比较2和3,设置a[i++]= a[j],数组为:1, 2, 2, 6, 9, 8
    不满足i<j结束循环,设置a[i=2]=3,数组为:1, 2, 3, 6, 9, 8

第五轮left = 1, right = 1,此轮无效,直接退出
第六轮left = 3, right = 2,此轮无效,直接退出
第七轮left = 4, right = 5,i = left, j = right,基准数p=9
  • j=6:比较8和9,8 < 9,设置a[i++] = a[j],数组为:1, 2, 3, 6, 8, 8
    不满足i<j结束循环,设置a[i = 5]=9,数组为:1, 2, 3, 6, 8, 9

第八轮left = 4, right = 4,此轮无效,直接退出
第九轮left = 6, right = 5,此轮无效,直接退出

三、算法实现

static void quickSort(int left, int right) {
		if (left >= right) {
			return;
		}
		int p = arr[left];
		int i = left;
		int j = right;
		while (i < j) {
			for (; i < j && arr[j] > p; j --) {
			}
			if (i < j) {
				arr[i++] = arr[j];
			}
			for (; i < j && arr[i] < p; i ++) {
			}
			if (i < j) {
				arr[j--] = arr[i];
			}
		}
		arr[i] = p;
		quickSort(left, i - 1);
		quickSort(j+1, right);
	}

三、参考链接

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

相关推荐

七大排序算法之快速排序

七大排序算法之快速排序七大排序算法之快速排序 快速排序的介绍 快速排序的核心思想 简单例子 时间复杂度的讨论 每轮快排的具体实现 代码 快速排序的介绍:快速排序是C. A. R. Hoare在1962年提出的,平均时间复杂度为O(nlogn)级的高效率算法,也是目前O(nlogn)的排序算法中使用最多的算法,这段时间想把自己学过的算法都整理一遍,于是就写了这篇博客,来记录自己的学习过程吧…也希望能给

harry_502的博客 980

【分治算法】快速排序算法(划分交换排序)

思路 用一个基准数对数组进行分隔,比它大的扔右边,小的扔左边去,递归运算… 静下来看快排还是很好理解的,随机取出一个数,将这个位置的数与最左端的数交换一次,并将左端数作为基准参考数,从右边开始向左找比基准数小的数,如果有,则把这个数赋值到左边儿去,然后从左边开始向右找比基准数大的数,如果有,则把这个数赋值到右边儿去,进行递归算法… 举例子: 3 5 8 2 6 中基准数base=3, 1、右侧开始...

我的技术栈碎碎念空间 1089

别再被systemd-resolved坑了!银河麒麟V10下用Bind9搭建内网DNS的完整避坑指南

本文详细介绍了在银河麒麟V10和Ubuntu系统下部署Bind9 DNS服务器时,如何解决与systemd-resolved的端口冲突问题。提供了五种专业级解决方案,包括彻底禁用systemd-resolved、智能端口转发等,并特别针对银河麒麟V10的安全加固需求给出了配置建议和诊断工具,帮助用户高效搭建内网DNS服务。

weixin_30342209的博客 654

基本排序(3)——快速排序

快速排序是一种效率非常高的排序方法,排序时需要先取一个基准值。该方法有三种不同实现方式。 #快速排序,hoare,挖坑法,前后指针法

Ctrl_C_V_is_easy的博客 345

深入解析Uplift模型评估:AUUC指标的计算与应用

本文深入解析了Uplift模型评估的核心指标AUUC。针对传统响应模型无法区分用户真实转化动因的痛点,AUUC通过量化模型对用户增益(Uplift)的排序能力,有效衡量营销干预的增量收益。文章详细拆解了AUUC的计算逻辑,从构建Qini曲线到Python代码实战,并强调了其在预算约束下的精准营销等场景的应用价值与常见陷阱。

weixin_29254029的博客 475

别再为通讯发愁了!手把手教你用PCAN-View调试Kinco步科伺服电机的CANopen

本文详细介绍了如何使用PCAN-View工具调试Kinco步科伺服电机的CANopen通讯,从环境搭建到实战演练,涵盖硬件连接、软件配置及故障排除。通过具体案例和代码示例,帮助工程师快速掌握伺服电机通讯控制技术,解决工业设备通讯难题。

weixin_29189377的博客 266

快速排序

快速排序 快速排序是先给一个数归位 找一个基准值(比基准值大的在右边,比基准值小的放左遍),一般选择左边第一个元素作为基准值,两个索引分别指向两端的数。 第一次循环索引从后往前比较,如果比基准值小则交换位置,如果没有继续比较下一个,直到找到比基准值小的值才交换。 当找到一个比基准值小的值交换了位置之后,索引又从前往后开始比较,比基准值大的交换位置。 如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。 反复比较。指向基准值的索引一直不动。 直到从前往后的索引>从

mf_sprite的博客 356

macOS 12.7.6部署Ollama+Dify避坑指南

本文介绍了在macOS 12.7.6系统下部署Ollama和Dify的详细步骤及避坑指南。主要内容包括:1)关闭系统完整性保护(SIP)以允许修改系统目录;2)安装特定版本的Docker(2.1.0.5)和docker-compose(v2.38.2)以避免兼容性问题;3)配置Ollama服务并下载nomic-embed-text和deepseek-r1:7b模型;4)针对macOS调整Dify的docker配置文件,包括延长超时时间、修改存储路径、增加资源限制等关键设置。文中提供了完整的命令操作步骤和配置

Hi20240217的博客 3101

day044:数组的高级操作(二):冒泡排序、递归、快速排序

一、冒泡排序 1.什么是冒泡排序? 相邻的数据两两比较,小的放前面,大的放后面 2.冒泡排序规律 如果有n个数据排序,则需要比较n-1次 每一次比较完毕,下一次比较都会减少一个数据 代码示例: package com.itheima; /*冒泡排序代码优化*/ public class BubbleSortDemo2 { public static void main(String[] args) { int[] arr = {3, 5, 2, 1, 4};

ZuoQi的博客 336

【Python实战解析】从数据爬取到房价预测:一个完整的数据科学项目流程拆解

本文详细拆解了一个完整的Python数据科学项目流程,从爬取长沙二手房数据到房价预测模型构建。通过实战案例,介绍了数据爬取、清洗、可视化及模型优化的关键技巧,帮助开发者掌握Python在数据分析中的应用,提升程序开发能力。

weixin_30379531的博客 411

用51单片机和LD3320语音模块DIY一个会说话的温度报警器(附完整代码)

本文详细介绍了如何使用51单片机和LD3320语音模块DIY一个智能温度报警器,包括硬件选型、电路设计、软件开发及核心功能实现。通过DS18B20温度传感器和语音模块的结合,实现温度超标时的语音报警功能,适合智能家居系统等应用场景。附完整代码,方便开发者快速复现。

weixin_42525632的博客 420

经典排序算法之:快速排序

  快速排序可能是应用最广泛的排序算法。快速排序流行的原因是它实现简单、适用于各种不同的输入数据且在一般应用中比其他排序算法都要快很多。此次,我们来学习一下快速排序算法。 一、快速排序算法含义   快速排序是一种分治的排序算法。它会在数组中选择一个基准元素,讲数组分为两部分,使得第一部分中的所有元素都小于或等于基准元素,而第二部分中的所有元素都大于基准元素。对第一部分和第二部分递归的应用快速排序算法。 二、快速排序算法过程 例如:   对数组 [5 2 9 3 8 4 0 1 6 7 ]进行快速排序   

Ctra_aaa的博客 1万+

Matlab实战:水声信号DEMON谱分析从入门到精通(附完整源码)

本文详细介绍了使用Matlab进行水声信号DEMON谱分析的完整流程,从基础理论到实战应用,涵盖信号预处理、包络提取、频谱分析等关键步骤,并附完整源码。特别针对水声通信中的低信噪比环境,提供了多种优化方案和性能提升技巧,帮助读者快速掌握这一水下目标检测的核心技术。

gamma的博客 295

十大排序算法——快速排序

快速排序是对冒泡排序的一种改进。 快速排序原理 1.首先设定一个分界值,通过该分界值将数组分成左右两部分﹔ 2.将大于或等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。此时左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值; 3.然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。 4.重复上述过程,可以看出,这是一个递归定义。通过递归将

龍弟-idea的博客 5181

通过Power Platform自定义D365 CE 业务需求 - 4. 使用Power Automate

Power Automate构建块Power Automate中的连接器流的类型和用途流中的动态值和表达式使用变量、循环和条件在Power Automate中处理审批业务场景、用例和实现Power Virtual Agent的概念Power Virtual Agent的构建块配置Power Virtual Agent示例在公共网站/门户中部署Power Virtual Agent业务场景、用例和实现。

Martin-Mei的博客 558

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

排序算法之快速排序

文章目录排序算法之快速排序排序过程:代码实现 排序算法之快速排序 排序过程: 1.首先找出标准数 standard,同常取数组中第一个数字为标准数 2.取两个移动坐标,一个叫低位坐标low 在最左边,另一个叫高位坐标high在最右边。 首先从高位上的数字开始: 循环(低位坐标在高位坐标左边&&右边的数字大于标准数字){ ​ 将高位移动坐标向前移动 } //出现高位上的数字小于标准数...

java川 356

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java排序算法之快速排序

        快速排序,顾名思义,速度快;其时间复杂度为(NlogN),那么它是如何运作来实现高速排序的呢?先讲一下它的基本原理:         (1)寻找到一个枢纽元,也就是在一组元素中找一个元素(怎么找是有讲究的);         (2)然后在这组元素中,比这个枢纽元小的放在左边,比其大的放在右边;         (3)然后对左右重复上述两步,即可实现从小到大排序;      ...

boy_chen93的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VC中sqlite的使用

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

双路快速排序和三路排序算法

三路快速排序是双路快速排序的进一步改进版本,三路排序算法把排序的数据分为三部分,分别为小于 v,等于 v,大于 v,v 为标定值,这样三部分的数据中,等于 v 的数据在下次递归中不再需要排序,小于 v 和大于 v 的数据也不会出现某一个特别多的情况),通过此方式三路快速排序算法的性能更优。如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对。我们可以使用本教程的归并思想求逆序对的数量。

b123321888的博客 1221

排序算法 -快速排序

排序算法-快快快速排序

shiyue 1234

快速排序算法详解与其他排序算法的比较

快速排序 属于原地排序,与自顶向下归并类似的是,也是先进行大数组的排序,然后递归到小数组,在进行排序时,先选定一个元素为切分元素,按大小将其他元素放到左右两侧即可 动画演示: P为切分元素 L为左标记 R为有标记 package Sort; import edu.princeton.cs.algs4.StdRandom; import static Sort.SortExample.*; import static edu.princeton.cs.algs4.StdRandom.unifo

qq_45921491的博客 1033
上一篇: 排序算法——冒泡排序
下一篇: 排序算法——快速排序2
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值