Go版数据结构 -【8.4 快速排序】
8.4 快速排序
快速排序是一种分而治之的排序算法。它通过随机选择一个基准元素,将数组分为两部分。
一部分比基准元素小,另一部分比基准元素大,之后对两部分排序。
快速排序以其平均情况下的 O(n log n) 时间复杂度和良好的性能而广泛应用。
本节代码存放目录为 lesson20
概念与原理
快速排序的基本思想
-
选择基准元素:从数组中选择一个元素作为基准,通常选择第一个元素或最后一个元素,也可以随机选择。
-
划分数组:将数组中的其他元素与基准元素进行比较,按照小于基准和大于基准分成两部分。
-
递归排序:对基准元素两侧的子数组分别递归地进行快速排序。
-
合并结果:经过每一轮划分和递归,数组最终变得有序。
总的来说,就是选出一个元素,通过与该基准元素的对比得到两个序列,左边的序列小于基准,右边的序列大于基准。
下一步再分别针对左边、右边进行递归的快速排序,最终左边、右边也都是有序的序列。
快速排序的步骤示例
给定如下无序数组,按照从小到大排序:
[5, 3, 8, 4, 2]
通过快速排序的步骤如下:
第一步:选择基准元素- 选择数组最后一个元素 2 作为基准,划分数组。- 比基准小的元素:[](没有元素小于 2)- 比基准大的元素:[5, 3, 8, 4]- 将基准元素 2 放在数组的正确位置,结果:[2, 3, 8, 4, 5]第二步:递归排序- 递归排序左侧数组(空数组,不需要处理)- 递归排序右侧数组 [3, 8, 4, 5]第三步:选择基准元素- 选择 5 作为基准,划分数组。- 比基准小的元素:[3, 4]
- 比基准大的元素:[8]- 将基准元素 5 放在数组的正确位置,结果:[2, 3, 4, 5, 8]第四步:递归快速排序- 递归快速排序左侧数组 [3, 4],选择基准 4,划分为 [3] 和 4- 最终排序结果为 [2, 3, 4, 5, 8]
通过快速排序,数组最终被排序为 [2, 3, 4, 5, 8]。
快速排序的时间复杂度
快速排序的时间复杂度取决于基准元素的选择:
-
最坏情况:
O(n²),当基准元素总是选择最小或最大值时,导致数组无法被均匀划分。 -
最好情况:
O(n log n),当每次划分都将数组均匀地分成两半。 -
平均情况:
O(n log n),通常情况下,快速排序的表现非常接近O(n log n)。
Go语言的实现
实现代码如下:
// partition 函数实现数组的划分
func partition(arr []int, low, high int) int {pivot := arr[high] // 选择最后一个元素作为基准i := low - 1 // i 代表已处理的元素区间// 遍历数组,将小于 pivot 的元素移到前面for j := low; j < high; j++ {if arr[j] < pivot {i++arr[i], arr[j] = arr[j], arr[i]}}// 将基准元素放到正确位置arr[i+1], arr[high] = arr[high], arr[i+1]return i + 1 // 返回基准元素的位置
}// quickSort 实现快速排序
func quickSort(arr []int, low, high int) {if low < high {// 划分数组,并获取基准元素的位置pi := partition(arr, low, high)// 递归排序基准左侧和右侧的子数组quickSort(arr, low, pi-1)quickSort(arr, pi+1, high)}
}func main() {arr := []int{5, 3, 8, 4, 2}quickSort(arr, 0, len(arr)-1)fmt.Println("最终排序结果: ", arr)
}
执行结果如下所示:
最终排序结果: [2 3 4 5 8]
小结
本节我们讲解了快速排序的基本原理、步骤示例和 Go 语言的实现。
关于本节总结如下:
-
时间复杂度:快速排序的平均时间复杂度为
O(n log n),但最坏情况下会退化为O(n²)。 -
稳定性:快速排序是不稳定的排序算法。
-
应用场景:快速排序在处理大规模数据时非常高效,适用于数据量较大且对排序性能要求高的场景。
我的GitHub:https://github.com/swxctx
书籍地址:https://gs.golang.website/
书籍代码:https://github.com/YouCanGolang/GoStructedCode
相关文章:
Go版数据结构 -【8.4 快速排序】
8.4 快速排序 快速排序是一种分而治之的排序算法。它通过随机选择一个基准元素,将数组分为两部分。 一部分比基准元素小,另一部分比基准元素大,之后对两部分排序。 快速排序以其平均情况下的 O(n log n) 时间复杂度和良好的性能而广泛应用…...
达梦DBLINK访问ORACLE配置方法
目录 1、概述 2、测试环境 3、语法简介 4、配置访问DM的DBLINK 5、配置访问ORACLE的DBLINK 5.1 通过OCI配置 5.2 通过ODBC配置 1、概述 本文介绍了达梦DBLINK的配置方法。有3部分内容,1)达梦访问到达梦的配置方法;2)通过OC…...
基础知识1
目录 1、gcd最大公因数 2、最小公倍数 3、素数问题 ①简单数学求法 ②素数筛 ③线性筛 1、gcd最大公因数 int gcd(int a,int b){return b0?a:gcd(b,a%b);} 做题过程中,如果数据太大,需要边做边对分子分母进行约分 2、最小公倍数 int a,b;scanf(&…...
网页前端开发之Javascript入门篇(9/9):对象
Javascript对象 什么是对象? 答:其概念跟 Python教程 的字典基本相似,虽然存有一些差异,不过对于目前的教程来讲可以忽略。 下面是对象的语法: var aaa {"弓" : "张","木" : "李",&…...
Oracle RAC IPC Send timeout detected问题分析处理
一、报错信息 今天在进行数据库巡检时,在集群节点1发现了IPC相关报错信息: 2024-10-10T10:22:06.84631708:00 IPC Receiver dump detected. Sender instance 2 Receiver pnum 277 ospid 377527 [oraclezxsszpt-sjkfwq1 (PPA6)], pser 124403 2024-10-1…...
QT 实现QMessageBox::about()信息自定义显示
这是我记录Qt学习过程的第四篇心得文章,主要是方便自己编写的应用程序显示“关于信息”,对QMessageBox::about()输入信息进行规范,可以设置应用程序名称,通过定义宏从pro文件获取应用程序版本号,以及编译程序的QT版本、…...
(C++进阶)C++20
目录 一、概述 二、新特性 1. 模块(Modules)功能 2. 概念(Concepts)功能 3. 范围(Ranges)功能 4. 协程(Coroutines)功能 5. 三路比较运算符(Spaceship Operator&a…...
【常用的安装破解版指令】MAC安装破解版软件显示文件损坏时
MAC安装破解版软件显示文件损坏时 复制以下命令粘贴到终端后 sudo xattr -rd com.apple.quarantine 打开Finder(访达),点击左侧的 应用程序,将应用拖进终端中,然后按键盘的回车键(return)&…...
【QT Quick】定时器和线程:定时器Timer
在现代用户界面开发中,动态更新内容、处理定时任务或异步任务是常见的需求,尤其在复杂应用中可能会遇到界面阻塞的问题。在 Qt Quick 中,定时器(Timer)和多线程是两种主要的解决方案,用于避免这种阻塞现象。…...
【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解
目录 1、NIO 2、NIO 和 IO 的区别 1. 阻塞 vs 非阻塞 2. 一个线程 vs 多个连接 3. 面向流 vs 面向缓冲 4. 多路复用 3、Channel & Buffer (1)Channel:双向通道 (2)Buffer:缓冲区 (3)ByteBufferÿ…...
HDLBits中文版,标准参考答案 | 3.1.3 Arithmetic Circuits | 算术电路
关注 望森FPGA 查看更多FPGA资讯 这是望森的第 10 期分享 作者 | 望森 来源 | 望森FPGA 目录 1 Half adder | 半加器 2 Full adder | 全加器 3 3-bit binary adder | 3位二进制加法器 4 Adder | 加法器 5 Signed addition overflow | 有符号数的加法溢出 6 100-bit bi…...
网络编程 websocket
1. HTTP 截至 2024 年,HTTP(HyperText Transfer Protocol)已经发展到 HTTP/3 版本。 各个版本的简介: HTTP/0.9(1991年): 最初的 HTTP 版本,非常简单,仅支持 GET 方法…...
【JDK17 | 5】Java 17 深入剖析:新的随机数生成器 API
引言 在 Java 17 中,新的随机数生成器 API 作为一个重要特性被引入,旨在提供更灵活和高效的随机数生成方案。新的 API 不仅支持多种生成算法,还改善了随机数生成的性能,适应了现代开发的需求。在本篇文章中,我们将深入…...
剪切走的照片:高效恢复与预防策略
一、剪切走的照片现象描述 在日常的数字生活中,照片作为记录生活点滴、工作成果的重要载体,其重要性不言而喻。然而,有时我们可能会遇到一种令人头疼的情况:原本打算通过剪切操作将照片移动到另一个位置,却意外地发现…...
基于XGBoost的结核分枝杆菌的耐药性预测研究【多种机器学习】
1. 绪论 目录 1. 绪论 1.1研究背景及意义 1.2国内外研究现状 1.2.1国内研究现状 1.2.2国外研究现状 1.3研究目的 2. 相关技术概念 2.1结核分枝杆菌的耐药性机制 2.2机器学习与系统发育法相结合 2.3XGBoost和随机森林算法的优势和应用 3. 模型设计 3.1数据准备与预…...
【C++差分数组】3229. 使数组等于目标数组所需的最少操作次数|2066
本文涉及知识点 C差分数组 LeetCode3229. 使数组等于目标数组所需的最少操作次数 给你两个长度相同的正整数数组 nums 和 target。 在一次操作中,你可以选择 nums 的任何子数组,并将该子数组内的每个元素的值增加或减少 1。 返回使 nums 数组变为 tar…...
浅谈PyTorch中的DP和DDP
目录 1. 引言2. PyTorch 数据并行(Data Parallel, DP)2.1 DP 的优缺点2.2 DP 实现代码示例 3. PyTorch 分布式数据并行(Distributed Data Parallel, DDP)3.1 DDP 的优缺点3.2 分布式基本概念3.3 DDP 的应用流程3.5 DDP 实现代码示…...
在Windows上利用谷歌浏览器进行视频会议和协作
随着远程工作和在线教育的普及,使用谷歌浏览器在Windows上进行视频会议和协作变得越来越常见。本文将为您提供一个详细的教程,教您如何在Windows上利用谷歌浏览器进行视频会议和协作,同时解决一些常见的问题。(本文由https://goog…...
VMware Fusion 13.6.1 发布下载,修复 4 个已知问题
VMware Fusion 13.6.1 发布下载,修复 4 个已知问题 VMware Fusion 13.6.1 for Mac - 领先的免费桌面虚拟化软件 适用于基于 Intel 处理器和搭载 Apple 芯片的 Mac 的桌面虚拟化软件 请访问原文链接:https://sysin.org/blog/vmware-fusion-13/ 查看最新…...
P9751 [CSP-J 2023] 旅游巴士
P 9751 P9751 P9751 部分分思路 题目要求时间必须是 k k k 的非负整数倍,所以想到了升维。这样就变成了一道分层图最短路的题目。用 BFS 算法可以拿到 A i 0 A_i0 Ai0 的 35 35 35 分。 满分思路 其实部分分的思路已经很接近正解了,想要拿到满…...
远程办公团队如何高效协作:项目管理的10条黄金法则
远程办公团队如何高效协作?本文结合10年项目管理实践,总结出目标对齐、书面共识、责任分工、沟通节奏、进度透明、风险预警、反馈复盘和团队信任等10条黄金法则,帮助管理者提升远程协作效率与项目交付质量。 远程办公已经成为许多团队的常态协…...
专注核心创新:用快马AI生成openclaw101开发效率工具链
在开发机械臂控制相关的项目时,我发现很多时间都花在了重复造轮子上。特别是做openclaw101这类机械爪的仿真或实体开发时,每次都要从零开始写轨迹规划、数据滤波这些基础功能。最近尝试用InsCode(快马)平台整理了一套工具链,效率提升非常明显…...
利用快马平台十分钟搭建yolo目标检测web演示原型
最近在尝试用YOLO算法做目标检测的Web演示,发现用InsCode(快马)平台可以超级快地搭建出原型。整个过程比我预想的简单太多,从零开始到实际运行只用了十分钟左右,特别适合想快速验证想法的时候用。这里记录下我的实现思路和具体步骤࿰…...
开源大模型部署新选择:cv_unet_image-colorization低门槛AI视觉实践
开源大模型部署新选择:cv_unet_image-colorization低门槛AI视觉实践 1. 引言 你是否翻出过家里的老相册,看着那些泛黄的黑白照片,想象着它们当年真实的色彩?或者,作为一名内容创作者,你是否曾为一张构图完…...
R语言实战:用sf和ggplot2绘制带比例尺和指北针的专业地图(附完整代码)
R语言地理信息可视化实战:从数据到专业地图的完整指南 地理信息数据可视化是科研和商业分析中不可或缺的一环。无论是环境监测、城市规划还是流行病学研究,将空间数据转化为直观的地图都能极大提升数据洞察力。本文将手把手教你使用R语言中的sf和ggplot2…...
Fire Dynamics Simulator:火灾动力学模拟的核心引擎与实战应用
Fire Dynamics Simulator:火灾动力学模拟的核心引擎与实战应用 【免费下载链接】fds Fire Dynamics Simulator 项目地址: https://gitcode.com/gh_mirrors/fd/fds 揭示核心价值:为何FDS成为火灾模拟领域的标准工具? 在建筑安全设计、…...
别再只会用0x22读VIN了!手把手教你用UDS诊断DID读取ECU的隐藏数据(附实战报文分析)
解锁ECU隐藏数据:UDS诊断中DID的高级应用实战 在汽车电子诊断领域,UDS协议中的0x22服务(读取数据标识符)常被工程师们简化为读取VIN码等基础信息的工具。但DID的真正潜力远不止于此——它就像一把可以打开ECU内部数据宝库的万能钥…...
Win11系统下MongoDB的安装与配置全攻略
1. MongoDB简介与环境准备 MongoDB作为当前最流行的NoSQL数据库之一,以其灵活的文档存储结构和出色的扩展性深受开发者喜爱。在Win11系统上部署MongoDB,可以轻松搭建本地开发环境或小型生产环境。我最近在帮团队搭建测试环境时,发现很多新手…...
3分钟掌握Mermaid:用代码思维绘制专业图表的核心技巧
3分钟掌握Mermaid:用代码思维绘制专业图表的核心技巧 【免费下载链接】mermaid mermaid-js/mermaid: 是一个用于生成图表和流程图的 Markdown 渲染器,支持多种图表类型和丰富的样式。适合对 Markdown、图表和流程图以及想要使用 Markdown 绘制图表和流程…...
工业自动化实战:如何用IEEE 802.1AS实现微秒级时间同步(附Linux配置)
工业自动化实战:如何用IEEE 802.1AS实现微秒级时间同步(附Linux配置) 在工业4.0和智能制造浪潮下,毫秒级时间同步已无法满足高端装备协同控制的需求。某汽车生产线曾因500微秒的时间偏差导致机械臂碰撞,直接造成数百万…...
