快速排序算法
快速排序是一种非常高效的排序算法,采用分治策略来对一个数组进行排序。它由C. A. R. Hoare在1960年提出。快速排序的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分继续进行排序,以达到整个序列有序。
一、基本步骤
- 选择基准:从数列中挑出一个元素,称为“基准”(pivot)。
- 分区操作:重新排列数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归排序子序列:递归地将小于基准的子序列和大于基准的子序列进行快速排序。
二、Java示例代码
public class QuickSort {public static void main(String[] args) {int[] arr = {10, 7, 8, 9, 1, 5};quickSort(arr, 0, arr.length - 1);System.out.println("Sorted array: ");printArray(arr);}// 快速排序函数public static void quickSort(int[] arr, int low, int high) {if (low < high) {// pi是分区操作后基准元素的位置int pi = partition(arr, low, high);// 递归地对基准左侧和右侧的子数组进行快速排序quickSort(arr, low, pi - 1); // 左侧子数组quickSort(arr, pi + 1, high); // 右侧子数组}}// 分区函数private static int partition(int[] arr, int low, int high) {// 选择最右边的元素作为基准int pivot = arr[high];// i指向比基准小的最后一个元素int i = (low - 1); // 最初i位于low-1位置for (int j = low; j < high; j++) {// 如果当前元素小于或等于pivotif (arr[j] <= pivot) {i++; // 增加i// 交换arr[i]和arr[j]int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 交换arr[i+1]和arr[high](或pivot)int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return i + 1; // 返回基准元素的新索引}// 打印数组public static void printArray(int[] arr) {for (int num : arr) {System.out.print(num + " ");}System.out.println();}
}
代码解析
- 主函数 (
main
方法):初始化一个整数数组,并调用quickSort
函数来对其进行排序。之后打印排序后的数组。 - 快速排序方法 (
quickSort
):接收一个数组以及要排序部分的起始和结束索引。如果起始索引小于结束索引,则执行以下操作:- 调用
partition
方法获取新的基准元素位置。 - 对基准元素左边的部分递归调用
quickSort
。 - 对基准元素右边的部分递归调用
quickSort
。
- 调用
- 分区方法 (
partition
):此方法用于将数组分成两部分,并返回基准元素的位置。它使用了两个指针:i
和j
。其中i
指向比基准值小的最后一个元素,而j
则遍历整个数组。每当遇到一个小于或等于基准的元素时,就将i
向右移动一位,并与j
处的元素交换。最后,将基准元素放到正确的位置上。 - 打印数组 (
printArray
):辅助函数,用于打印数组中的所有元素。
三、特点
1. 高效性
- 快速排序在平均情况下的时间复杂度为O(n log n),这使得它成为一种非常高效的排序算法,尤其适用于大数据集。
- 在实际应用中,由于其内部循环可以很好地利用缓存,快速排序往往比其他O(n log n)的排序算法(如归并排序)表现得更好。
2. 原地排序
- 快速排序是一种原地排序算法,即除了递归所需的栈空间外,不需要额外的存储空间。这意味着它的空间复杂度通常为O(log n),这是由于递归调用栈的深度。
3. 不稳定性
- 快速排序是不稳定的排序算法,即相等元素的相对顺序可能在排序后发生变化。这是因为当两个相等的元素被放在基准的两侧时,它们的原始顺序可能会被打乱。
4. 分治法
- 快速排序采用分治策略,通过选择一个基准元素将数组分成两个子数组,然后对这两个子数组分别进行递归排序。这种分而治之的方法使得快速排序能够有效地处理大规模数据集。
5. 最佳、最坏和平均情况
- 最佳情况下,每次划分都能均匀分割数组,时间复杂度为O(n log n)。
- 最坏情况下,如果每次选取的基准都是最小或最大元素,那么每次只能排除一个元素,此时时间复杂度退化为O(n^2)。
- 平均情况下,快速排序的时间复杂度也是O(n log n)。
6. 灵活性高
7. 易于实现
相关文章:
快速排序算法
快速排序是一种非常高效的排序算法,采用分治策略来对一个数组进行排序。它由C. A. R. Hoare在1960年提出。快速排序的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分…...
CSS定位
定位 其中,绝对定位和固定定位会脱离文档流 设置定位之后:可以使用四个方向值进行调整位置:left、top、right、bottom 相对定位 温馨提示 设置定位之后,相对定位和绝对定位他是相对于具有定位的父级元素进行位置调整,…...
追加docker已运行容器添加或修改端口映射方法
docker run可以指定端口映射 【】docker run -d -p 80:80 --name name 但是容器一旦生成,就没有一个命令可以直接修改。通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射。 【】 docker stop A 【】 doc…...
53 基于单片机的8路抢答器加记分
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 首先有三个按键 分别为开始 暂停 复位,然后八个选手按键,开机显示四条杠,然后按一号选手按键,数码管显示30,这…...
ubuntu多版本安装gcc
1.ubuntu安装gcc 9.3.1 $ sudo apt update $ sudo apt install gcc-9 g-9 二、配置GCC版本 安装完成后,需要使用update-alternatives命令来配置GCC版本。这个命令允许系统在多个安装的版本之间进行选择 1.添加GCC 9.3.1到update-alternatives管理 $ sudo update-a…...
异步处理优化:多线程线程池与消息队列的选择与应用
目录 一、异步处理方式引入 (一)异步业务识别 (二)明确异步处理方式 二、多线程线程池(Thread Pool) (一)工作原理 (二)直面优缺点和适用场景 1.需要快…...
音视频技术扫盲之预测编码的基本原理探究
预测编码是一种数据压缩技术,广泛应用于图像、视频和音频编码等领域。其基本原理是利用数据的相关性,通过对当前数据的预测和实际值与预测值之间的差值进行编码,从而实现数据压缩的目的。 一、预测编码的基本概念 预测编码主要包括预测器和…...
计算机毕业设计SpringCloud+大模型微服务高考志愿填报推荐系统 高考大数据 SparkML机器学习 深度学习 人工智能 Python爬虫 知识图谱
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
AIGC训练效率与模型优化的深入探讨
文章目录 1.AIGC概述2.AIGC模型训练效率的重要性3.模型优化的概念与目标4.模型优化策略4.1 学习率调节4.2 模型架构选择4.3 数据预处理与增强4.4 正则化技术4.5 量化与剪枝 5.代码示例6.结论 人工智能领域的发展,人工智能生成内容( AIGC)越来…...
《深入浅出HTTPS》读书笔记(13):块密码算法之迭代模式(续)
CTR模式 每次迭代运算的时候要生成一个密钥流(keystream)。 各个密钥流之间是有关系的,最简单的方式就是密钥流不断递增,所以才叫作计数器模式。 ◎在处理迭代之前,先生成每个密钥流,有n个数据块࿰…...
定时任务删除MongoDB历史数据
前言 MongoDB数据过多,导致存储成本飙升,为了降低成本,需要将历史数据删除。 删除逻辑 添加配置文件控制删除逻辑 syncconfig:deleteMongoConfig:#同步状态,true同步,false不同步syncStatus: true#删除数据的时间&…...
Simulink的SIL软件在环测试
以基于模型的设计(MBD)的软件开发时,需要进行SIL(软件在环测试)。SIL测试就是在PC上验证模型是否与代码功能一致。在项目开展中,用在需要将控制器生成移植到硬件前,把控制器的模块生成代码&…...
你能穿过迷雾看清一切吗
很多事情的真相有谁知道? 我和家里人被看不见的攻击攻击和操控,失控和无助状态被假鬼录制,然后安排某些不知道整个实际情况和真相的人去听,间接歪曲了整件事情。 各种高科技配合和各种脑功能操控伤害是一般人想都想不到的&#…...
8 设计模式之简单工厂模式
设计模式是软件开发中的一套通用解决方案,而简单工厂模式则是最基础、最常用的一种创建型模式。在这篇博客中,我将为大家详细介绍简单工厂模式的概念、优缺点,以及通过一个饮料制作的案例,帮助大家更好地理解和应用这种模式。 一、…...
一步一步写线程之十六线程的安全退出之一理论分析
一、多线程的开发 多线程的开发,在实际场景中几乎是无法避开的。即使是前端看似没有使用线程,其实在底层的框架中也使用了线程进行了支撑。至少到现在,不管是协程还是其它什么新的编程方式,仍然无法撼动线程的主流地位。 多线程的…...
《Learn Three.js》学习(4) 材质
前言: 材质为scene中物体的皮肤,有着不同的特性和视觉效果。 材质的共有属性: 基础属性: 融合属性: 融合决定了我们渲染的颜色如何与它们后面的颜色交互 高级属性: 与WebGL内部有关 简单材质࿱…...
【QNX+Android虚拟化方案】128 - QNX 侧触摸屏驱动解析
【QNX+Android虚拟化方案】128 - QNX 侧触摸屏驱动解析 一、QNX 侧触摸屏配置基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不泄密、不传播代码文档!!! 本文禁止转载分享 !!! 汇总链接:《【QNX+Android虚拟化方案】00 - 系列文章链接汇总》 本文链接:《【…...
Oracle SCN与时间戳的映射关系
目录 一、基本概述 二、相关操作 三、参考文档 一、基本概述 Oracle 数据库中的 SYS.SMON_SCN_TIME 表是一个关键的内部表,主要用于记录过去时间段中SCN与具体的时间戳之间的映射关系。这种映射关系可以帮助用户将 SCN 值转换为可读性更强的时间戳,从而…...
量化交易系统开发-实时行情自动化交易-8.2.发明者FMZ平台
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于发明者FMZ平台介绍。 发明…...
HBU深度学习作业9
1. 实现SRN (1)使用Numpy实现SRN import numpy as npinputs np.array([[1., 1.],[1., 1.],[2., 2.]]) # 初始化输入序列 print(inputs is , inputs)state_t np.zeros(2, ) # 初始化存储器 print(state_t is , state_t)w1, w2, w3, w4, w5, w6, w7, …...
关于otter监控告警使用
一、背景 近期在使用otter完成单机房单向同步时,常常遇到channel假死的情况,导致Pipeline同步停止,系统表数据同步停止,影响生产环境用户数据查询相关的功能,虽然事后能够通过停channel后再启用channel重新启用…...
复合查询和内外连接
文章目录 1. 简单查询2. 多表查询2.1 显示雇员名、雇员工资以及所在部门的名字2.2 显示部门号为10的部门名,员工名和工资2.3 显示各个员工的姓名,工资,及工资级别 3. 自连接4. 子查询4.1 where后的子查询4.1.1 单行子查询4.1.2 多行子查询 (i…...
动态规划【C++优质版】
(本文未经作者书面允许,禁止以任何形式传播(包括但不限于转载,翻译……)如需引用 请标注原作者) Intro: 动态规划是一种用于解决优化问题的算法策略。在 C 中,它主要用于处理那些具…...
柔性芯片:实现万物互联的催化剂
物联网 (IoT) 市场已经非常成熟,麦肯锡预测,物联网将再创高峰,到 2030 年将达到 12.5 万亿美元的估值。然而,万物互联 (IoE) 的愿景尚未实现,即由数十亿台智能互联设备组成,提供大规模洞察和效率。 究竟是…...
【分布式】分布式事务
目录 1、事务的发展 2、本地事务 (1)如何保障原子性和持久性? (2)如何保障隔离性? 2、全局事务 (1)XA事务的两段式提交 (2)XA事务的三段式提交…...
nacos安装部署
nacos安装部署 1.安装nacos 1.安装nacos nacos的安装很简单下载后解压启动即可,但是在启动前请确保jdk环境正常; 1.首先我们要下载nacos安装包:可以到官网下载,注意我这里使用的是2.1.0版本; 2.下载完成后࿰…...
git 上传代码时报错
在上传代码时,显示无法上传 PS E:\JavaWeb\vue3-project> git push To https://gitee.com/evening-breeze-2003/vue3.git! [rejected] master -> master (non-fast-forward) error: failed to push some refs to https://gitee.com/evening-breeze-20…...
【C++】数字位数提取:从个位到十位的深入分析与理论拓展
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯第一题:提取个位数解法代码解法分析代码优化拓展思考:取模运算的普适性 💯第二题:提取十位数题目解读与思路分析方法一&…...
数据结构--二叉树的创建和遍历
目录 引入 定义 性质 二叉树的创建 迭代法 注意事项: 递归法 注意事项: 二叉树的遍历 深度优先 广度优先 先序遍历(前序遍历) 中序遍历 后序遍历 层序遍历 查找树结构中是否存在某数值 方法一: 方法…...
CEF127 编译指南 Linux篇 - 安装Git和Python(三)
1. 引言 在前面的文章中,我们已经完成了基础开发工具的安装和配置。接下来,我们需要安装两个同样重要的工具:Git 和 Python。这两个工具在 CEF 的编译过程中扮演着关键角色。Git 负责管理和获取源代码,而 Python 则用于运行各种编…...
计算机网络的类型
目录 按覆盖范围分类 个人区域网(PAN) 局域网(LAN) 城域网(MAN) 4. 广域网(WAN) 按使用场景和性质分类 公网(全球网络) 外网 内网(私有网…...
Web入门(学习笔记)
Web入门 文章目录 Web入门SpringSpringBootWeb入门HTTP协议HTTP-概述HTTP特点 HTTP-请求协议HTTP-请求数据格式 HTTP-响应协议响应状态码 HTTP-协议解析 Web服务器-TomcatWeb服务器简介基本使用Tomcat文件夹目录解析常见问题Tomcat部署项目 入门程序解析**内嵌的Tomcat服务器**…...
mind+自定义库编写注意事项
在mind图形化命令编写中,main.ts 文件是通过图形化编程工具生成 C 代码,然后将生成的 C 代码上传到 Arduino Uno 上执行。 这些由main.ts定义的图形化代码通过生成的代码,需要包含调用arduinoc/libraries文件夹的*.h和*.cpp文件&#…...
jQuery零基础入门速通(上)
大家好,我是小黄。 在前端开发的世界里,jQuery以其简洁的语法和强大的功能,一直是许多开发者手中的利器。它不仅简化了HTML文档遍历和操作、事件处理、动画以及Ajax交互,还极大地提高了开发效率。本文将带你走进jQuery的世界&…...
计算机网络-Wireshark探索IPv4
使用工具 Wiresharkcurl(MacOS)traceroute: This lab uses “traceroute” to find the router level path from your computer to a remote Internet host. traceroute is a standard command-line utility for discovering the Internet paths that your computer uses. It i…...
【05】Selenium+Python 两种文件上传方式(AutoIt)
上传文件的两种方式 一、input标签上传文件 可以用send_keys方法直接上传文件 示例代码 input标签上传文件import time from selenium import webdriver from chromedriver_py import binary_path # this will get you the path variable from selenium.webdriver.common.by i…...
《构建 C++分布式计算框架:赋能人工智能模型并行训练》
在人工智能迅猛发展的今天,模型训练所需的计算资源呈指数级增长。为了高效地支持人工智能模型在多节点、多 GPU/CPU 集群上的并行训练,基于 C构建分布式计算框架成为了关键之举。 一、分布式计算框架的核心意义 随着人工智能模型复杂度的不断攀升&…...
分支定价算法Branch and price
分支定价算法是进阶版的列生成算法,是用来专门求解整数规划问题的。 目录 1.整数规划与线性规划的关系 2.限制主问题(RLMP)求得整数解 3.B&P用法:以VRPTW为例 列生成是求解线性规划问题的算法,通过不断往限制主…...
【信息系统项目管理师】第5章:信息系统工程 考点梳理
文章目录 5.1 软件工程5.1.1 架构设计1、软件架构风格2、软件架构评估 5.1.2 需求分析1、需求的层次2、需求过程(重点)3、UML事务、关系和视图4、面向对象分析 5.1.3 软件设计1、结构化设计2、面向对象设计3、设计模式 5.1.4 软件实现1、软件配置管理2、…...
kdump调试分析(适用于麒麟,ubuntu等OS)
1. kdump基本原理 1.1 内核崩溃处理机制 当 Linux 系统内核发生崩溃时,通常会触发 panic,系统停止正常运行。Kdump 在这种情况下: 使用一个备用的内核(称为 crash kernel)来启动最小化的环境。从崩溃的主内核中复制内存内容(转储文件)。将转储文件保存到预定义的存储位…...
Ubuntu在NVME硬盘使用Systemback安装记录
问题 使用Systemback重装系统找不到NVME硬盘。 0.使用Systemback制作iso后,制作启动盘 1.插入启动盘进入live mode模式 2.安装gparted sudo apt-get update sudo apt-get install gparted3.使用gparted对待分区硬盘进行分区 gparted按照你希望的分区方式分区即…...
C++多态的实现原理
【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 1、类的继承 子类对象在创建时会首先调用父类的构造函数 父类构造函数执行结束后,执行子类的构造函数 当父类的构造函数有参数时,需要在子类的初始化列表中显式调用 Child(int i) : …...
com.github.gavlyukovskiy依赖是做什么的呢?
p6spy-spring-boot-starter 是一个Spring Boot的starter,用于集成P6Spy库。P6Spy是一个开源的数据库连接池代理工具,它可以拦截和记录所有的SQL语句及其执行时间,从而帮助开发者进行SQL性能分析和调试。 功能概述 SQL日志记录: P…...
QChart数据可视化
目录 一、QChart基本介绍 1.1 QChart基本概念与用途 1.2 主要类的介绍 1.2.1 QChartView类 1.2.2 QChart类 1.2.3QAbstractSeries类 1.2.4 QAbstractAxis类 1.2.5 QLegendMarker 二、与图表交互 1. 动态绘制数据 2. 深入数据 3. 缩放和滚动 4. 鼠标悬停 三、主题 …...
离线安装 Docker-IO:详细步骤指南
离线安装 Docker-IO:详细步骤指南 一、准备工作1.1 下载 Docker 离线安装包1.2 准备安装环境1.3 配置防火墙和 SELinux(可选)二、上传和解压离线安装包2.1 上传安装包2.2 解压安装包三、安装 Docker-IO3.1 移动 Docker 文件到系统目录3.2 配置 Docker 服务3.3 赋予服务文件执…...
梯度爆炸与消失
梯度爆炸和梯度消失 一、概念解析 (一)梯度爆炸 定义 在深度神经网络训练的反向传播过程中,梯度爆炸是指梯度的值过大的现象。这会使模型的参数更新出现异常。 产生原因 深层网络与链式法则:深度神经网络按链式法则计算某层权重…...
动捕 动作捕捉学习笔记
2024.11.28 实时动作捕捉 ThreeDPoseTracker VRMLiveViewer 实现虚拟主播跳舞自由_哔哩哔哩_bilibili blender 手工操作,不能渲染到原视频 【快速有效】三分钟学会,通过blender把网上视频武术动作捕捉绑定到3D角色上,需要使用Auto-rig Pro(ARP…...
spark3.x之后时间格式数据偶发报错org.apache.spark.SparkUpgradeException
3.x之后如果你去处理2.x生成的时间字符串数据,很容易遇到一个问题 Error operating ExecuteStatement: org.apache.spark.SparkUpgradeException: You may get a different result due to the upgrading of Spark 3.0: Fail to parse 20200725__cb90fcc3_8006_46…...
计算机网络(二)
ip地址:11010010:01011110:00100100:00010100 子网掩码:11111111:11111111:11111111:11000000 and :11010010:01011110:00100100:00000000 210.94.36.0的下一站为R1 因为255为11111111 192为ÿ…...
如何在Spark中使用gbdt模型分布式预测
这目录 1 训练gbdt模型2 第三方包python环境打包3 Spark中使用gbdt模型3.1 spark配置文件3.2 主函数main.py 4 spark任务提交 1 训练gbdt模型 我们可以基于lightgbm快速的训练一个gbdt模型,训练相对比较简单,只要把训练样本处理好,几行代码可…...