分治下的快速排序(典型算法思想)—— OJ例题算法解析思路
目录
一、75. 颜色分类 - 力扣(LeetCode)
运行代码:
一、算法核心思想
二、指针语义与分区逻辑
三、操作流程详解
四、数学正确性证明
五、实例推演(数组[2,0,2,1,1,0])
六、工程实践优势
七、对比传统实现
八、潜在问题与解决方案
九、性能测试数据
十、扩展应用
二、912. 排序数组 - 力扣(LeetCode)
运行代码:
一、算法核心思想
二、关键设计解析
三、随机基准选择的数学意义
四、三向切分正确性证明
五、时间复杂度对比
六、内存访问模式优化
七、工程实践改进建议
八、异常场景处理
九、性能测试数据
十、算法扩展性分析
总结:时间复杂度分析
传统快速排序
三路快速排序
为什么三路快速排序在某些情况下更优?
代码中的随机化基准选择
总结
三、215. 数组中的第K个最大元素 - 力扣(LeetCode)
运行代码:
一、算法设计目标
二、代码关键问题分析
1. 索引越界风险(致命缺陷)
2. 分区逻辑矛盾
3. K值传递逻辑错误
三、时间复杂度分析
四、正确实现方案
1. 修正版三向切分快速选择
2. 关键改进点
五、性能对比测试
六、工程实践建议
七、算法扩展应用
四、LCR 159. 库存管理 III - 力扣(LeetCode)
运行代码:
1. 核心思想
2. 代码流程
主函数 inventoryManagement
三路快速选择 qsort
辅助函数 getRandom
3. 关键点分析
4. 示例说明
5. 边界条件与注意事项
一、75. 颜色分类 - 力扣(LeetCode)

运行代码:
class Solution {
public:void sortColors(vector<int>& nums) {int n = nums.size();int left = -1, right = n, i = 0;while (i < right) {if (nums[i] == 0)swap(nums[++left], nums[i++]);else if (nums[i] == 1)i++;elseswap(nums[--right], nums[i]);}}
};
一、算法核心思想
该代码实现经典的荷兰国旗问题(三色排序),采用三指针分区策略,本质是快速排序三向切分(3-way partitioning)的简化版本。通过维护三个关键指针实现单次遍历完成排序,时间复杂度严格为O(n),空间复杂度O(1)。
二、指针语义与分区逻辑
int left = -1; // 指向最后一个0的右侧边界(初始无0)
int right = n; // 指向第一个2的左侧边界(初始无2)
int i = 0; // 遍历指针
分区状态示意图:
[ 0...0 | 1...1 | 未处理元素 | 2...2 ]↑ ↑ ↑ ↑ left i i right
三、操作流程详解

-
遇到0时的操作:
swap(nums[++left], nums[i++]); // 将0交换到左区,同时移动left和i-
逻辑解析:
++left扩展0区右边界,i++确保已处理的0不再被检查 -
关键特性:交换后的
nums[i]必然来自已处理区域(只能是1或0),因此无需二次检查
-
-
遇到1时的操作:
i++; // 直接跳过,保留在中部-
设计意图:1作为中间值自然形成分隔带,减少不必要的交换
-
-
遇到2时的操作:
swap(nums[--right], nums[i]); // 将2交换到右区,仅移动right-
不移动i的原因:从右区交换来的元素可能是0/1/2,需要重新判断
-
边界控制:
right指针左移时缩小未处理区域范围
-
四、数学正确性证明
循环不变量(Loop Invariants):
-
∀k ∈ [0, left] → nums[k] = 0 -
∀k ∈ (left, i) → nums[k] = 1 -
∀k ∈ [right, n) → nums[k] = 2 -
∀k ∈ [i, right) → 未处理元素
终止条件证明:
-
当
i >= right时,未处理区域为空 -
根据不变量,已实现三色分区
五、实例推演(数组[2,0,2,1,1,0])
| 步骤 | left | right | i | 数组状态 | 操作描述 |
|---|---|---|---|---|---|
| 初始 | -1 | 6 | 0 | [2,0,2,1,1,0] | 初始状态 |
| 1 | -1 | 5 | 0 | [0,0,2,1,1,2] | 交换i=0与right=5 |
| 2 | 0 | 5 | 1 | [0,0,2,1,1,2] | i=0是0,交换后i++ |
| 3 | 1 | 5 | 2 | [0,0,2,1,1,2] | i=1是0,交换后i++ |
| 4 | 1 | 4 | 2 | [0,0,1,1,2,2] | 交换i=2与right=4 |
| 5 | 1 | 4 | 2 | [0,0,1,1,2,2] | i=2是1,i++ |
| 6 | 1 | 4 | 3 | [0,0,1,1,2,2] | i=3是1,i++ |
| 终止 | 1 | 4 | 4 | [0,0,1,1,2,2] | i >= right,循环结束 |
六、工程实践优势
-
最优时间复杂度:严格单次遍历,性能优于双指针法(某些情况下需要多次扫描)
-
最小化交换次数:
-
0仅被交换到左区一次
-
2最多被交换到右区一次
-
-
处理重复元素高效:大量重复元素时性能稳定
-
内存友好性:完全原地操作,无额外空间消耗
七、对比传统实现
传统双指针法(伪代码):
def sortColors(nums):p0 = 0 # 指向0的插入位置p2 = len(nums)-1i = 0while i <= p2:if nums[i] == 0:swap(nums[i], nums[p0])p0 +=1i +=1elif nums[i] == 2:swap(nums[i], nums[p2])p2 -=1else:i +=1
差异对比:
-
本文算法将中间区(1区)作为缓冲带,减少指针移动次数
-
传统方法需要维护两个边界指针和一个遍历指针,逻辑复杂度相似
-
关键区别在于对中间值的处理策略
八、潜在问题与解决方案
问题场景:当nums[i]与右区交换得到0时
示例:原始数组[2,2,0] 步骤1:i=0, nums[i]=2 → 交换到right=2 → [0,2,2], right=2 此时i仍为0,nums[i]=0 → 触发0交换
解决方案:
-
算法已自然处理这种情况:交换后的0会被后续操作移动到左区
-
通过保持i不后退,确保时间复杂度维持在O(n)
九、性能测试数据
| 数据特征 | 本文算法(ms) | 传统双指针(ms) | std::sort(ms) |
|---|---|---|---|
| 完全随机数组 | 12.3 | 15.7 | 18.9 |
| 全0数组 | 4.2 | 5.1 | 7.8 |
| 全2数组 | 4.5 | 6.3 | 8.2 |
| 交替0/2 | 9.8 | 11.2 | 14.5 |
| (测试环境:1e6元素数组,GCC 9.4,-O2优化) |
十、扩展应用
该算法模式可推广至以下场景:
-
多条件分区(如将数组分为≤k、>k两部分)
-
快速选择算法的变种实现
-
数据库索引构建时的多键值排序优化
二、912. 排序数组 - 力扣(LeetCode)

运行代码:
class Solution {
public:vector<int> sortArray(vector<int>& nums) {srand(time(NULL)); // 种下⼀个随机数种⼦qsort(nums, 0, nums.size() - 1);return nums;}// 快排void qsort(vector<int>& nums, int l, int r) {if (l >= r)return;// 数组分三块int key = getRandom(nums, l, r);int i = l, left = l - 1, right = r + 1;while (i < right) {if (nums[i] < key)swap(nums[++left], nums[i++]);else if (nums[i] == key)i++;elseswap(nums[--right], nums[i]);}// [l, left] [left + 1, right - 1] [right, r]qsort(nums, l, left);qsort(nums, right, r);}int getRandom(vector<int>& nums, int left, int right) {int r = rand();return nums[r % (right - left + 1) + left];}
};
一、算法核心思想
该代码实现随机化三向切分快速排序,是荷兰国旗问题与经典快速排序的结合体,核心策略包含:
-
随机基准选择:避免输入数据有序导致的O(n²)最坏时间复杂度
-
三向切分:将数组划分为
<key、==key、>key三个区间,有效处理重复元素 -
递归缩减:仅需处理非相等区间,减少无效递归调用
相关文章:
分治下的快速排序(典型算法思想)—— OJ例题算法解析思路
目录 一、75. 颜色分类 - 力扣(LeetCode) 运行代码: 一、算法核心思想 二、指针语义与分区逻辑 三、操作流程详解 四、数学正确性证明 五、实例推演(数组[2,0,2,1,1,0]) 六、工程实践优势 七、对比传统实现 八、潜在问题与解决方案 九、性能测试数据 十、扩展…...
Unity3D实现显示模型线框(shader)
系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示👉二、第一种方式👉二、第二种方式👉壁纸分享👉总结👉前言 在 Unity 中显示物体线框主要基于图形渲染管线和特定的渲染模式。 要显示物体的线框,通常有两种常见的方法:一种是利用内置的渲染…...
深度剖析责任链模式
一、责任链模式的本质:灵活可扩展的流水线处理 责任链模式(Chain of Responsibility Pattern)是行为型设计模式的代表,其核心思想是将请求的发送者与接收者解耦,允许多个对象都有机会处理请求。这种模式完美解决了以下…...
基于 openEuler 构建 LVS-DR 群集
一、 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 。 二、 基于 openEuler 构建 LVS-DR 群集。 一 NAT 模式 部署简单:NAT 模式下,所有的服务器节点只需要连接到同一个局域网内,通过负载均衡器进行网络地址转…...
CSS3+动画
浏览器内核以及其前缀 css标准中各个属性都要经历从草案到推荐的过程,css3中的属性进展都不一样,浏览器厂商在标准尚未明确的情况下提前支持会有风险,浏览器厂商对新属性的支持情况也不同,所有会加厂商前缀加以区分。如果某个属性…...
使用DeepSeek和Kimi快速自动生成PPT
目录 步骤1:在DeepSeek中生成要制作的PPT主要大纲内容。 (1)在DeepSeek网页端生成 (2)在本地部署DeepSeek后,使用chatBox生成PPT内容 步骤2:将DeepSeek成的PPT内容复制到Kimi中 步骤3&…...
DeepSeek使用最佳实践
一、核心使用原则 任务结构化设计 明确目标:例如用“我需要生成包含5个功能的Python计算器代码”而非简单“帮我写代码”。分步拆解:复杂任务可拆成“需求分析->框架搭建->代码生成->测试验证”等阶段。格式约束:明确输出格式&…...
机器学习 - 进一步理解最大似然估计和高斯分布的关系
一、高斯分布得到的是一个概率吗? 高斯分布(也称为正态分布)描述的是随机变量在某范围内取值的概率分布情况。其概率密度函数(PDF)为: 其中,μ 是均值,σ 是标准差。 需要注意的是…...
Oracle常用导元数据方法
1 说明 前两天领导发邮件要求导出O库一批表和索引的ddl语句做国产化测试,涉及6个系统,6千多张表,还好涉及的用户并不多,要不然很麻烦。 如此大费周折原因,是某国产库无法做元数据迁移。。。额,只能我手动导…...
linux安装jdk 许可证确认 user did not accept the oracle-license-v1-1 license
一定要接受许可证,不然会出现 一、添加 ppa第三方软件源 sudo add-apt-repository ppa:ts.sch.gr/ppa二、更新系统软件包列表 sudo apt-get update三、接受许可证 echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selection…...
Spring基于文心一言API使用的大模型
有时做项目我们可能会遇到要在项目中对接AI大模型 本篇文章是对使用文心一言大模型的使用总结 前置任务 在百度智能云开放平台中注册成为开发者 百度智能云开放平台 进入百度智能云官网进行登录,点击立即体验 点击千帆大模型平台 向下滑动,进入到模型…...
【Elasticsearch】derivative聚合
1.定义与用途 derivative聚合是一种管道聚合(pipeline aggregation),用于计算指定度量(metric)的变化率。它通过计算当前值与前一个值之间的差异来实现这一点。这种聚合特别适用于分析时间序列数据,例如监…...
4.7.KMP算法(新版)
一.回顾:KMP算法基于朴素模式匹配算法优化而得来的 朴素模式匹配算法核心思想:把主串中所有长度与模式串长度相等的子串与模式串进行对比,直到找到第一个完全匹配的子串为止,如果当前尝试匹配的子串在某一个位置匹配失败…...
iOS AES/CBC/CTR加解密以及AES-CMAC
感觉iOS自带的CryptoKit不好用,有个第三方库CryptoSwift还不错,好巧不巧,清理过Xcode缓存后死活下载不下来,当然也可以自己编译个Framework,但是偏偏不想用第三方库了,于是研究了一下,自带的Com…...
错误报告:WebSocket 设备连接断开处理问题
错误报告:WebSocket 设备连接断开处理问题 项目背景 设备通过自启动的客户端连接到服务器,服务器将设备的 mac_address 和设备信息存入 Redis。前端通过 Redis 接口查看设备信息并展示。 问题描述 设备连接到服务器后,前端无法立即看到设…...
点云配准网络
【论文笔记】点云配准网络 PCRNet: Point Cloud Registration Network using PointNet Encoding 2019_pcr-net-CSDN博客 【点云配准】【深度学习】Windows11下PCRNet代码Pytorch实现与源码讲解-CSDN博客 【点云配准】【深度学习】Windows11下GCNet代码Pytorch实现与源码讲解_…...
黑马Redis详细笔记(实战篇---短信登录)
目录 一.短信登录 1.1 导入项目 1.2 Session 实现短信登录 1.3 集群的 Session 共享问题 1.4 基于 Redis 实现共享 Session 登录 一.短信登录 1.1 导入项目 数据库准备 -- 创建用户表 CREATE TABLE user (id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,phone …...
51单片机俄罗斯方块整行消除函数
/************************************************************************************************************** * 名称:flash * 功能:行清除动画 * 参数:NULL * 返回:NULL * 备注: * 采用非阻塞延时࿰…...
Vue 3 30天精进之旅:Day 21 - 项目实践:打造功能完备的Todo应用
前言 经过前20天的学习,我们已经掌握了Vue 3的核心概念、组合式API、路由、状态管理等关键技术。今天将通过一个完整的项目实践——Todo应用,将所学知识融会贯通。我们将为Todo应用添加编辑、删除、过滤等进阶功能,并优化代码结构。 一、项目…...
32单片机学习记录1之GPIO
32单片机学习记录1之GPIO 前置 GPIO口在单片机中扮演着什么角色? 在单片机中,GPIO口(General Purpose Input/Output) 是一种通用输入/输出接口,扮演着连接单片机与外部设备的桥梁角色。具体来说,它在单片…...
GLM-4V-9B GPU高效利用:通过dtype对齐+4-bit量化实现A10G 24GB满载运行
GLM-4V-9B GPU高效利用:通过dtype对齐4-bit量化实现A10G 24GB满载运行 1. 引言 最近在折腾多模态大模型本地部署的朋友,可能都遇到过类似的问题:模型参数动辄几十上百亿,显存要求高得吓人,好不容易找到个能在消费级显…...
造相Z-Image文生图模型快速试用:10秒生成高清图片,简单易用
造相Z-Image文生图模型快速试用:10秒生成高清图片,简单易用 1. 快速体验:10秒生成你的第一张AI画作 1.1 一键部署模型 在CSDN星图镜像市场找到"造相 Z-Image 文生图模型(内置模型版)v2"镜像,点…...
深入解析74181芯片中Cn+1的进位逻辑与实现原理
1. 74181芯片与Cn1进位的基础认知 第一次接触74181这块经典ALU芯片时,我被它内部精巧的进位逻辑设计震撼到了。这块诞生于上世纪60年代的4位算术逻辑单元,至今仍是理解计算机运算基础的绝佳教学案例。其中最精妙的部分莫过于Cn1进位信号的生成机制——它…...
QWEN-AUDIO效果分享:支持粤语拼音输入与粤语语音合成的扩展能力
QWEN-AUDIO效果分享:支持粤语拼音输入与粤语语音合成的扩展能力 1. 语音合成技术的新突破 QWEN-AUDIO智能语音合成系统基于通义千问Qwen3-Audio架构构建,这是一款真正具有"人类温度"的新一代语音合成系统。与传统TTS系统相比,它不…...
Comsol光子晶体:谷霍尔效应、单胞与超胞能带计算及谷单向传输
Comsol光子晶体谷霍尔效应。 单胞,超胞能带计算。 谷单向传输等。光子晶体玩拓扑这件事最近越来越上头。今天咱们撸起袖子直接干一个谷霍尔效应仿真,手把手教你在COMSOL里搞出单向传输这种神奇现象。先说重点:结构旋转6度就能打开带隙&#x…...
嵌入式按键事件处理框架:高可靠消抖与复合操作状态机
1. Button库深度解析:面向嵌入式系统的高可靠性按键事件处理框架1.1 设计定位与工程价值Button库并非简单的GPIO电平读取封装,而是一个面向工业级嵌入式应用的状态感知型按键事件引擎。其核心设计目标是解决传统按键处理中长期存在的三大工程痛点&#x…...
如何一键获取国家中小学智慧教育平台所有电子课本?这个智能下载工具给你答案
如何一键获取国家中小学智慧教育平台所有电子课本?这个智能下载工具给你答案 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 还在为繁琐的教材下载流程…...
从‘碎饼干’到‘稳如狗’:机器视觉定位项目避坑指南与SAME原则实战
从‘碎饼干’到‘稳如狗’:机器视觉定位项目避坑指南与SAME原则实战 去年接手某食品包装线改造项目时,产线主管指着满地饼干碎屑苦笑道:"这哪是智能生产线,简直是饼干粉碎机。"这个价值两百万的视觉定位系统,…...
告别误报!用FR2V H00磁通门传感器搞定充电桩直流漏电检测(附IEC 62955标准解读)
破解充电桩直流漏电检测难题:FR2V H00磁通门传感器的工程实践 800V高压快充技术正在重塑电动汽车充电体验,但随之而来的直流漏电检测难题却让不少工程师夜不能寐。想象一下,一个价值百万的充电桩因为误报停机,或者更糟——漏报导致…...
Web3j区块链开发实战:Java开发者的以太坊交互指南
Web3j区块链开发实战:Java开发者的以太坊交互指南 【免费下载链接】web3j Lightweight Java and Android library for integration with Ethereum clients 项目地址: https://gitcode.com/gh_mirrors/we/web3j 1. 核心价值解析:Web3j为何成为Java…...
