【常用算法:排序篇】2.快速排序的算法精要

快速排序是算法领域的"九阳神功",掌握其精髓能让你在算法修炼之路上突破瓶颈。

1. 快速排序的核心思想

快速排序(Quicksort)是一种基于分治思想的高效排序算法,核心步骤为:

  1. 选择基准值(Pivot):通常选择待排序区间的第一个元素(也可随机选或取中间值)。 [元素≤pivot] + [pivot] + [元素>pivot]
  2. Partition(分割)操作
    • 将数组分为两部分,使得基准值左侧元素均 ≤ 基准值,右侧元素均 ≥ 基准值。
    • 实现方法:通过交替从右向左、从左向右扫描,交换不符合条件的元素,最终确定基准值的正确位置。
  3. 递归处理子数组:对基准值左右两侧的子数组重复上述步骤,直到所有元素有序。

2. Partition操作的关键细节

  • 空位交替填充:选择基准值后,其初始位置视为“空位”,通过交替从后向前扫描小元素、从前向后扫描大元素,将元素填入空位,最终确定基准值的位置。
  • 时间复杂度:单次 Partition 操作的时间复杂度为 O(n),需遍历整个子数组。

示例
原始数组 [8, 6, 3, 10, 9, 7, 2, 12],选择 8 为基准值:

  1. 从右向左找到 2 < 8,将其填入空位 → [2, 6, 3, 10, 9, 7, _, 12]
  2. 从左向右找到 10 > 8,将其填入空位 → [2, 6, 3, _, 9, 7, 10, 12]
  3. 重复直至基准值位置确定 → [2, 6, 3, 7, 9, 8, 10, 12]

3.两种经典实现方式

1. Lomuto分区(直观易实现):

  • 以最后一个元素为基准
  • 双指针维护分割点
    def partition(arr, low, high):pivot = arr[high]i = low  # 分割点for j in range(low, high):if arr[j] <= pivot:arr[i], arr[j] = arr[j], arr[i]i += 1arr[i], arr[high] = arr[high], arr[i]return i
    

2. Hoare分区(更高效):

  • 使用首元素为基准
  • 双指针从两端向中间扫描
    def partition(arr, low, high):pivot = arr[low]left, right = low+1, highwhile True:while left <= right and arr[left] <= pivot: left += 1while left <= right and arr[right] >= pivot: right -= 1if left > right: breakarr[left], arr[right] = arr[right], arr[left]arr[low], arr[right] = arr[right], arr[low]return right
    

4. 时间复杂度分析

快速排序的性能高度依赖基准值的选择:

  • 最好情况:每次基准值均接近中位数,递归树高度为 log₂n,时间复杂度为 O(n log n)
  • 最坏情况:基准值始终为极值(如最大值或最小值),递归退化为链表,时间复杂度为 O(n²)
  • 平均情况:随机选择基准值时,时间复杂度接近 O(n log n)

类比二叉树

  • 每次 Partition 将数组分为左右子树,递归深度对应树的高度。
  • 树越平衡(层数少),效率越高;树越不平衡(层数多),效率越低。

5. 快速排序的优化与应用

  • 工程优化:混合排序策略(如 C++ STL 的 sort 函数结合快速排序、插入排序和堆排序)。
  • 尾递归优化
def quick_sort(arr, low, high):while low < high:pi = partition(arr, low, high)quick_sort(arr, low, pi-1)low = pi + 1  # 减少递归深度
  • 三路快排
    • 处理大量重复元素:划分为 <pivot、=pivot、>pivot 三部分
  • 实际应用
    • 2-sum 问题:先排序再使用双指针法高效求解。
    • 快速选择算法(QuickSelect):基于 Partition 操作,在 O(n) 时间内找到第 k 小元素(下节课重点)。

6. 学习要点与误区

  • 关键思维:理解 Partition 操作是掌握快速排序的核心。
  • 常见误区
    • 忽视基准值选择对性能的影响。
    • 混淆 Partition 实现细节(如扫描顺序、交换条件)。
  • 实践建议
    • 手动模拟 Partition 过程(如纸上画图)。
    • 尝试编码实现快速排序,并通过调试理解递归流程。

7.总结

快速排序通过“分治 + Partition”高效解决排序问题,其核心在于:

  1. 分治思想:将大问题分解为小问题递归处理。
  2. 基准值选择:直接影响算法性能,需结合实际场景优化。
  3. 时间复杂度:平均 O(n log n),是多数场景下的首选排序算法。

掌握快速排序不仅为后续算法(如快速选择、归并排序)奠定基础,更是理解分治与递归思维的经典案例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在现代Web应用中集成 PDF.js (pdfjs-dist 5.2 ESM): 通过 jsdelivr 实现动态加载与批注功能的思考

PDF 文档在现代 Web 应用中越来越常见&#xff0c;无论是作为文档预览、报告展示还是在线编辑的载体。Mozilla 的 PDF.js 是一个功能强大的 JavaScript 库&#xff0c;它使得在浏览器端渲染和显示 PDF 文件成为可能&#xff0c;无需依赖原生插件。 本文将深入探讨如何在你的项…

基于FPGA控制ADC0832双通道采样+电压电流采样+LCD屏幕显示

基于FPGA控制ADC0832双通道采样电压电流采样LCD屏幕显示 前言一、芯片手册阅读1.SPI通信时序 二、仿真分析三、代码分析总结视频演示 前言 定制 要求使用ADC0832芯片进行ADC采样。其中电压采样以及电流采样是固定电路&#xff0c;是硬件设计&#xff0c;跟软件没没关系。本质上…

生产部署方案pm2配合python3脚本

前言 使用python3来处理redis 消息队列&#xff0c;记录下生产部署方案 「生产部署方案」&#xff1a; 多进程&#xff08;动态扩容&#xff09;无限自愈日志自动压缩系统级守护可多队列多worker 终极稳健版&#xff1a;PM2 Logrotate 自动扩容 守护链 适合&#xff1a…

Python全流程开发实战:基于IMAP协议安全下载个人Gmail邮箱内所有PDF附件

文章目录 一、需求分析与安全前置&#xff1a;为什么需要专用工具&#xff1f;1.1 痛点场景1.2 技术方案选择 二、准备工作&#xff1a;Gmail账号安全配置与环境搭建2.1 开启两步验证&#xff08;必做&#xff01;&#xff09;2.2 创建应用专用密码&#xff08;替代普通密码&am…

巧用python之--模仿PLC(PLC模拟器)

工作中用到了VM(VisionMaster4.3)有时候需要和PLC打交道,但是PLC毕竟是别人的,不方便修改别人的程序,这时候需要一个灵活的PLC模拟器是多么好呀! 先说背景: PLC型号 汇川Easy521: Modbus TCP 192.168.1.10:502 在汇川Easy521中Modbus保持寄存器D寄存器 ,在modbus协议中 0-4区…

docker构建镜像并上传dockerhub

docker构建镜像并上传dockerhub 前提条件&#xff1a;需要连接梯子 将梯子配置到虚拟机中&#xff08;确保主机能够连接 hub.docker.com&#xff09; 使用ipconfig 查询主机的 ip4地址虚拟机的连接模式改成桥接模式&#xff08;复制主机的地址网络&#xff09;将ip4配置到虚拟…

python实现的音乐播放器

python实现的音乐播放器 音乐播放器,原来写过一个简陋的例子,可见 https://blog.csdn.net/cnds123/article/details/137874107 那个不能拖动播放进度条上的滑块到新的位置播放。下面介绍的可以拖动播放进度条上的滑块到新的位置播放。 简单实用的音乐播放器 这个简单实用的…

[网安工具] 端口信息收集工具 —— 御剑高速 TCP 全端口扫描工具 · 使用手册

&#x1f31f;想了解其它网安工具&#xff1f;看看这个&#xff1a;[网安工具] 网络安全工具管理 —— 工具仓库 管理手册 https://github.com/NepoloHebo/Yujian-high-speed-TCP-full-port-scannerhttps://github.com/NepoloHebo/Yujian-high-speed-TCP-full-port-scanner 0…

数字孪生赋能智慧城市:从概念到落地的深度实践

在城市规模与复杂度持续攀升的当下&#xff0c;传统管理模式已难以满足现代城市精细化治理需求。数字孪生技术凭借构建虚拟城市镜像、实现实时数据交互与智能决策的特性&#xff0c;成为智慧城市建设的核心引擎。本文将通过多个典型案例&#xff0c;深度解析数字孪生技术如何重…

DeFi开发系统软件开发:技术架构与生态重构

DeFi开发系统软件开发&#xff1a;技术架构与生态重构 ——2025年去中心化金融开发的范式革新与实践指南 一、技术架构演进&#xff1a;从单一链到多链混合引擎 现代DeFi系统开发已从单一公链架构转向“跨链互操作混合模式”&#xff0c;结合中心化效率与去中心化安全双重优势…

相同IP和端口的服务器ssh连接时出现异常

起因 把服务器上的一个虚拟机搞坏了&#xff0c;所以删除重新创建了一个&#xff0c;端口号和IP与之前的虚拟机相同。 ssh usernameIP -p port 时报错 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone…

验证es启动成功

1. 查看命令行输出信息 在启动 Elasticsearch 时&#xff0c;命令行窗口会输出一系列日志信息。若启动成功&#xff0c;日志里通常会有类似下面的信息&#xff1a; plaintext [2025-05-06T13:20:00,000][INFO ][o.e.n.Node ] [node_name] started其中 [node_na…

CentOS网络之network和NetworkManager深度解析

文章目录 CentOS网络之network和NetworkManager深度解析1. CentOS网络服务发展历史1.1 传统network阶段&#xff08;CentOS 5-6&#xff09;1.2 过渡期&#xff08;CentOS 7&#xff09;1.3 新时代&#xff08;CentOS 8&#xff09; 2. network和NetworkManager的核心区别3. ne…

Unity:父挂 Rigidbody2D、子挂 Collider2D 时触发器不生效的问题分析

目录 ❓问题现象 &#x1f50d; 排查与定位 ⚠️ Unity 触发机制的核心要求 ✅ 为什么把 Collider2D 移到父物体后就能触发&#xff1f; &#x1f4a1; 解决方案 在 Unity 2D 游戏开发中&#xff0c;很多人习惯用父物体挂载 Rigidbody2D&#xff0c;而将不同的身体部位&am…

Google AI版图:解析AI Studio, Gemini, NotebookLM与GCP

1. 2C vs 2B: AI Studio: 主要是面向开发者&#xff0c;提供一个易用的界面来探索和构建基于Google模型的应用。虽然最终的应用可能服务于C端或B端&#xff0c;但AI Studio本身更多是一个开发者的工具平台&#xff0c;可以看作是连接模型能力和各种应用的桥梁。它可以被个人开…

Oracle EBS AP发票被预付款核算创建会计科目时间超长

背景 由于客户职能部门的水电、通信和物业等等费用统一管理或对接部门报销费,在报销费的时候,用户把所有费用分摊到各个末级部门,形成AP发票行有上千行, 问题症状 1、用户过账时,请求创建会计科目一直执行20多个小时未完成,只能手工强行取消请求。 2、取消请求以后,从后…

MySQL中MVCC指什么?

简要回答&#xff1a; MVCC&#xff08;multi version concurrency control&#xff09;即多版本并发控制&#xff0c;为了确保多线程下数据的安全&#xff0c;可以通过undo log和ReadView来实现不同的事务隔离级别。 对于已提交读和可重复读隔离级别的事务来说&#xff0c;M…

赛季7靶场 -- Checker --User flag

本系列仅说明靶场的攻击思路&#xff0c;不会给出任何的详细代码执行步骤&#xff0c;因为个人觉得找到合适的工具以实现攻击思路的能力也非常重要。root要逆向&#xff0c;没做了&#xff0c;但是user flag也有借鉴意义&#xff0c;关于2FA的绕过我们有必要了解 1.首先Nmap扫描…

【RAG技术全景解读】从原理到工业级应用实践

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1f6a8; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f50d; 一、技术原理剖析&#x1f4d0; 核心概念图解&#x1f4a1; 核心作用讲解⚙️ 关键技术模块说明⚖️ 技术选型对比 &…

【嵌入式开发-RS-485】

嵌入式开发-RS-485 ■ RS-485 连接方式■ RS-485 半双工通讯■ RS-485 的特点■ UART硬流控■ RS-4851. 全双工、半双工接线2. 拓扑结构3. RS-485收发器3.1 发送模式&#xff08;TX&#xff09;3.2 接收模式&#xff08;RX&#xff09; 4. RS-485数据链路5. RS-485常用电路6. C…