当前位置: 首页 > news >正文

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 快速排序 快速排序是一种分而治之的排序算法。它通过随机选择一个基准元素&#xff0c;将数组分为两部分。 一部分比基准元素小&#xff0c;另一部分比基准元素大&#xff0c;之后对两部分排序。 快速排序以其平均情况下的 O(n log n) 时间复杂度和良好的性能而广泛应用…...

达梦DBLINK访问ORACLE配置方法

目录 1、概述 2、测试环境 3、语法简介 4、配置访问DM的DBLINK 5、配置访问ORACLE的DBLINK 5.1 通过OCI配置 5.2 通过ODBC配置 1、概述 本文介绍了达梦DBLINK的配置方法。有3部分内容&#xff0c;1&#xff09;达梦访问到达梦的配置方法&#xff1b;2&#xff09;通过OC…...

基础知识1

目录 1、gcd最大公因数 2、最小公倍数 3、素数问题 ①简单数学求法 ②素数筛 ③线性筛 1、gcd最大公因数 int gcd(int a,int b){return b0?a:gcd(b,a%b);} 做题过程中&#xff0c;如果数据太大&#xff0c;需要边做边对分子分母进行约分 2、最小公倍数 int a,b;scanf(&…...

网页前端开发之Javascript入门篇(9/9):对象

Javascript对象 什么是对象? 答&#xff1a;其概念跟 Python教程 的字典基本相似&#xff0c;虽然存有一些差异&#xff0c;不过对于目前的教程来讲可以忽略。 下面是对象的语法&#xff1a; var aaa {"弓" : "张","木" : "李",&…...

Oracle RAC IPC Send timeout detected问题分析处理

一、报错信息 今天在进行数据库巡检时&#xff0c;在集群节点1发现了IPC相关报错信息&#xff1a; 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学习过程的第四篇心得文章&#xff0c;主要是方便自己编写的应用程序显示“关于信息”&#xff0c;对QMessageBox::about()输入信息进行规范&#xff0c;可以设置应用程序名称&#xff0c;通过定义宏从pro文件获取应用程序版本号&#xff0c;以及编译程序的QT版本、…...

(C++进阶)C++20

目录 一、概述 二、新特性 1. 模块&#xff08;Modules&#xff09;功能 2. 概念&#xff08;Concepts&#xff09;功能 3. 范围&#xff08;Ranges&#xff09;功能 4. 协程&#xff08;Coroutines&#xff09;功能 5. 三路比较运算符&#xff08;Spaceship Operator&a…...

【常用的安装破解版指令】MAC安装破解版软件显示文件损坏时

MAC安装破解版软件显示文件损坏时 复制以下命令粘贴到终端后 sudo xattr -rd com.apple.quarantine 打开Finder&#xff08;访达&#xff09;&#xff0c;点击左侧的 应用程序&#xff0c;将应用拖进终端中&#xff0c;然后按键盘的回车键&#xff08;return&#xff09;&…...

【QT Quick】定时器和线程:定时器Timer

在现代用户界面开发中&#xff0c;动态更新内容、处理定时任务或异步任务是常见的需求&#xff0c;尤其在复杂应用中可能会遇到界面阻塞的问题。在 Qt Quick 中&#xff0c;定时器&#xff08;Timer&#xff09;和多线程是两种主要的解决方案&#xff0c;用于避免这种阻塞现象。…...

【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解

目录 1、NIO 2、NIO 和 IO 的区别 1. 阻塞 vs 非阻塞 2. 一个线程 vs 多个连接 3. 面向流 vs 面向缓冲 4. 多路复用 3、Channel & Buffer (1&#xff09;Channel&#xff1a;双向通道 (2&#xff09;Buffer&#xff1a;缓冲区 (3&#xff09;ByteBuffer&#xff…...

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 年&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff09;已经发展到 HTTP/3 版本。 各个版本的简介&#xff1a; HTTP/0.9&#xff08;1991年&#xff09;&#xff1a; 最初的 HTTP 版本&#xff0c;非常简单&#xff0c;仅支持 GET 方法…...

【JDK17 | 5】Java 17 深入剖析:新的随机数生成器 API

引言 在 Java 17 中&#xff0c;新的随机数生成器 API 作为一个重要特性被引入&#xff0c;旨在提供更灵活和高效的随机数生成方案。新的 API 不仅支持多种生成算法&#xff0c;还改善了随机数生成的性能&#xff0c;适应了现代开发的需求。在本篇文章中&#xff0c;我们将深入…...

剪切走的照片:高效恢复与预防策略

一、剪切走的照片现象描述 在日常的数字生活中&#xff0c;照片作为记录生活点滴、工作成果的重要载体&#xff0c;其重要性不言而喻。然而&#xff0c;有时我们可能会遇到一种令人头疼的情况&#xff1a;原本打算通过剪切操作将照片移动到另一个位置&#xff0c;却意外地发现…...

基于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。 在一次操作中&#xff0c;你可以选择 nums 的任何子数组&#xff0c;并将该子数组内的每个元素的值增加或减少 1。 返回使 nums 数组变为 tar…...

浅谈PyTorch中的DP和DDP

目录 1. 引言2. PyTorch 数据并行&#xff08;Data Parallel, DP&#xff09;2.1 DP 的优缺点2.2 DP 实现代码示例 3. PyTorch 分布式数据并行&#xff08;Distributed Data Parallel, DDP&#xff09;3.1 DDP 的优缺点3.2 分布式基本概念3.3 DDP 的应用流程3.5 DDP 实现代码示…...

在Windows上利用谷歌浏览器进行视频会议和协作

随着远程工作和在线教育的普及&#xff0c;使用谷歌浏览器在Windows上进行视频会议和协作变得越来越常见。本文将为您提供一个详细的教程&#xff0c;教您如何在Windows上利用谷歌浏览器进行视频会议和协作&#xff0c;同时解决一些常见的问题。&#xff08;本文由https://goog…...

VMware Fusion 13.6.1 发布下载,修复 4 个已知问题

VMware Fusion 13.6.1 发布下载&#xff0c;修复 4 个已知问题 VMware Fusion 13.6.1 for Mac - 领先的免费桌面虚拟化软件 适用于基于 Intel 处理器和搭载 Apple 芯片的 Mac 的桌面虚拟化软件 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-fusion-13/ 查看最新…...

P9751 [CSP-J 2023] 旅游巴士

P 9751 P9751 P9751 部分分思路 题目要求时间必须是 k k k 的非负整数倍&#xff0c;所以想到了升维。这样就变成了一道分层图最短路的题目。用 BFS 算法可以拿到 A i 0 A_i0 Ai​0 的 35 35 35 分。 满分思路 其实部分分的思路已经很接近正解了&#xff0c;想要拿到满…...

初创公司如何借助Taotoken管理多模型API调用与成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 初创公司如何借助Taotoken管理多模型API调用与成本 对于资源有限的初创技术团队而言&#xff0c;快速迭代产品并集成多种AI能力是常…...

别再死记硬背节点了!用UE5蓝图系统,像搭积木一样做出你的第一个会动的潜艇

用UE5蓝图系统零代码实现潜艇动画&#xff1a;可视化编程的积木式入门指南 当第一次打开虚幻引擎5的蓝图编辑器时&#xff0c;许多初学者会被密密麻麻的节点和连线吓退。但想象一下&#xff0c;如果这些节点不是晦涩的代码符号&#xff0c;而是乐高积木般的可视化指令块——这就…...

STM32与ADS1256的SPI通信实战:从寄存器配置到串口数据可视化

1. 硬件准备与电路连接 第一次接触ADS1256这块24位ADC芯片时&#xff0c;我被它的精度吓到了——理论上能分辨出0.000000119V的电压变化&#xff01;不过要让STM32和它正常对话&#xff0c;硬件连接是第一个门槛。我用的STM32F103C8T6最小系统板&#xff0c;和ADS1256模块之间…...

当Agent开始自我调试、自我迭代——斯坦福CRFM最新实验揭示:自主进化阈值将在18个月内被突破

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;当Agent开始自我调试、自我迭代——斯坦福CRFM最新实验揭示&#xff1a;自主进化阈值将在18个月内被突破 核心突破&#xff1a;从工具调用到元认知闭环 斯坦福CRFM团队在2024年Q2发布的《Self-Improvi…...

抖音图片怎么去水印?2026年在线去水印工具+方法盘点,总有一款适合你

开篇&#xff1a;为什么要去水印&#xff1f; 保存抖音图片时&#xff0c;总会遇到水印的困扰。这些水印包含抖音logo、发布者名称&#xff0c;有时还会有账号信息。对于自媒体创作者、内容整理者或普通用户来说&#xff0c;去除水印往往是必需的。本文将介绍当下最实用的抖音图…...

终极免费方案:3步轻松解锁QQ音乐加密文件,让音乐随处可听

终极免费方案&#xff1a;3步轻松解锁QQ音乐加密文件&#xff0c;让音乐随处可听 【免费下载链接】qmcflac2mp3 直接将qmcflac文件转换成mp3文件&#xff0c;突破QQ音乐的格式限制 项目地址: https://gitcode.com/gh_mirrors/qm/qmcflac2mp3 你是否曾遇到过这样的情况&a…...

5个场景深度解析:如何用bili2text将B站视频变成你的私人知识库

5个场景深度解析&#xff1a;如何用bili2text将B站视频变成你的私人知识库 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 凌晨两点&#xff0c;小林还在为明…...

终极指南:如何用BabelDOC彻底解决PDF翻译格式错乱问题

终极指南&#xff1a;如何用BabelDOC彻底解决PDF翻译格式错乱问题 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 还在为学术论文翻译后排版全乱而烦恼吗&#xff1f;&#x1f62b; 技术文档翻…...

CircuitPython状态灯、安全模式与文件系统故障排查实战指南

1. 项目概述与核心价值 如果你正在用CircuitPython做项目&#xff0c;无论是物联网传感器节点、智能穿戴设备还是互动艺术装置&#xff0c;大概率都遇到过这样的瞬间&#xff1a;板子上的RGB状态灯突然开始闪烁诡异的颜色&#xff0c;或者电脑上那个熟悉的 CIRCUITPY U盘图标…...

构建高可用AI模型代理服务:统一接口、智能路由与生产级部署

1. 项目概述&#xff1a;一个无处不在的AI助手接口最近在折腾AI应用开发的朋友&#xff0c;可能都遇到过这样一个痛点&#xff1a;想在自己的项目里快速接入一个靠谱的、能处理复杂对话的AI模型&#xff0c;但要么被OpenAI的API调用限制和网络问题搞得焦头烂额&#xff0c;要么…...