【算法】分治 - 快速排序

文章目录
- 引言
- 一、颜色分类
- 二、排序数组
- 三、数组中的第k个数
- 四、最小的k个数
- 总结
引言
本节主要介绍快速排序(三路划分,随机取key),以及它的变形算法——快速选择算法
一、颜色分类

细节:快速排序中标准的partition(三路划分)
- 设置三个指针 left,cur,right
- 划分为三个区域[0, left - 1],[left, right],[right + 1, n-1]
- [0, left - 1]:元素小于key
- [left, right]:元素等于key
- [right + 1, n-1]:元素大于key
- left和right用来维护(等于key的)中路元素区域的左右两端,cur用来扫描数组
class Solution
{
public:void sortColors(vector<int>& nums){int left = 0, cur = 0, right = nums.size() - 1;while(cur <= right){if(nums[cur] == 0) swap(nums[left++], nums[cur++]);else if(nums[cur] == 2) swap(nums[right--], nums[cur]);else ++cur;}}
};
二、排序数组

思路:
- 递归出口:区间只有一个元素或者不存在
- 随机选key:利用rand函数,记得提前srand种下随机数种子
- 三路划分:三指针维护区间
- 分治:继续递归[begin, left - 1],[right + 1, end]两个区间
class Solution
{
public:int getKey(vector<int>& nums, int left, int right){int keyi = rand() % (right - left + 1) + left;return nums[keyi];}void quickSort(vector<int>& nums, int begin, int end){if(begin >= end) return;int key = getKey(nums, begin, end);//随机选keyint cur = begin, left = begin, right = end;while(cur <= right){if(nums[cur] < key) swap(nums[left++], nums[cur++]);else if(nums[cur] > key) swap(nums[right--], nums[cur]);else cur++;}quickSort(nums, begin, left - 1);quickSort(nums, right + 1, end);}vector<int> sortArray(vector<int>& nums){srand(0);//种下随机数种子quickSort(nums, 0, nums.size() - 1);return nums;}
};
三、数组中的第k个数

思路:TopK问题有三种解法
- 排序——O(NlogN)
- 堆——O(NlogK)
- 快速选择——O(N)
堆版本
细节:建大堆 + k-1次删除
class Solution
{
public:void AdjustDown(vector<int>& nums, int parent){int n = nums.size(), child = 2 * parent + 1;while(child < n){if(child + 1 < n && nums[child] < nums[child + 1]) ++child;if(nums[parent] < nums[child])//建大堆{swap(nums[parent], nums[child]);parent = child;child = 2 * parent + 1;}else break;}}int findKthLargest(vector<int>& nums, int k){int n = nums.size();for(int i=(n-1-1)/2; i>=0; --i){AdjustDown(nums, i);}while(--k)//执行k-1次{swap(nums[0], nums[nums.size() - 1]);nums.pop_back();AdjustDown(nums, 0);}return nums[0];}
};
快速选择版本

细节:
- 从最右边开始数,k落在右区域,则继续递归找第k大
- k落在中区域,则直接更新结果
- k落在左区域,则继续递归找第k-b-c大
class Solution
{int ret;
public:int GetKey(vector<int>& nums, int begin, int end){int keyi = rand() % (end - begin + 1) + begin;return nums[keyi];}void qucikSelect(vector<int>& nums, int begin, int end, int k){if(begin > end) return;int key = GetKey(nums, begin, end);int left = begin, cur = begin, right = end;while(cur <= right){if(nums[cur] < key) swap(nums[left++], nums[cur++]);else if(nums[cur] > key) swap(nums[right--], nums[cur]);else cur++;}if(k <= end - right) qucikSelect(nums, right + 1, end, k);else if(k <= end - left + 1) ret = key;else qucikSelect(nums, begin, left - 1, k - (end - left + 1));}int findKthLargest(vector<int>& nums, int k){srand(0);qucikSelect(nums, 0, nums.size() - 1, k);return ret;}
};
四、最小的k个数


细节:
- 从最左边开始数,k落在左区域,则继续递归找最小的k个元素
- k落在中区域,则直接返回前k个元素
- k落在右区域,则继续递归找最小的k-a-b个元素
class Solution
{
public:int getKey(vector<int>& nums, int begin, int end){int keyi = rand() % (end - begin + 1) + begin;return nums[keyi];}void quickSelect(vector<int>& nums, int begin, int end, int k){if(begin >= end) return;int key = getKey(nums, begin, end);int left = begin, cur = begin, right = end;while(cur <= right){if(nums[cur] < key) swap(nums[left++], nums[cur++]);else if(nums[cur] > key) swap(nums[right--], nums[cur]);else cur++;}if(k <= left - begin) quickSelect(nums, begin, left - 1, k);else if(k <= right + 1 - begin) return;else quickSelect(nums, right + 1, end, k - (right + 1 - begin));}vector<int> inventoryManagement(vector<int>& nums, int k){srand(0);quickSelect(nums, 0, nums.size() - 1, k);return {nums.begin(), nums.begin() + k};}
};
总结
快速排序,随机选key,保证了时间复杂度逼近O(NlogN),三路划分,是为了处理重复大量元素。
快速选择,是基于快速排序的变形算法,在解决TopK问题有着O(N)的时间复杂度,极其高效!

相关文章:
【算法】分治 - 快速排序
快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、颜色分类二、排序数组三、数组中的第k个数四、最小的k个数总结 引言 本节主要介绍快速排序…...
设计模式13——桥接模式
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 桥接模式(Bridge&a…...
第十六讲:数据在内存中的存储
第十六讲:数据在内存中的存储 1.整数在内存中的存储1.1存储方式1.2大小端字节序1.3大小端字节序排序规则1.4为什么要有大小端1.5练习1.5.1练习11.5.2练习21.5.3练习31.5.4练习41.5.5练习51.5.6练习61.5.7练习7 2.浮点数在内存中的存储2.1练习2.2浮点数的存储2.3浮点…...
【EXCEL_VBA_基础知识】15 使用ADO操作外部数据
课程来源:王佩丰老师的《王佩丰学VBA视频教程》,如有侵权,请联系删除! 目录 1. 使用ADO链接外部数据源 2. 常用SQL语句(Execute(SQL语句)) 2.1 查询数据、查询某几个字段、带条件查询、合并两表数据、插…...
如何在Spring中配置Bean?
在Spring框架中配置Bean,主要有以下几种方式: XML配置文件注解配置Java配置类 1. XML配置文件 早期的Spring版本广泛使用XML配置文件来定义和配置Bean。在XML中,可以通过 <bean> 标签定义Bean,指定其类、唯一标识符&…...
深入学习 torch.distributions
0. 引言 前几天分几篇博文精细地讲述了《von Mises-Fisher 分布》, 以及相应的 PyTorch 实现《von Mises-Fisher Distribution (代码解析)》, 其中以 Uniform 分布为例简要介绍了 torch.distributions 包的用法. 本以为已经可以了, 但这两天看到论文 The Power Spherical dist…...
Java中的判断校验非空问题
目录 字符串 字符串是空的情况 字符串不是空的情况 对象 对象是空的情况 对象不是空的情况 前端传的 int ,double类型等等 Optional 判断情况 https://www.cnblogs.com/zhangboyu/p/7580262.htmlhttps://www.cnblogs.com/zhangboyu/p/7580262.html 值为空的情况,不会…...
webman使用summernote富文本编辑器
前言 Summernote富文本编辑器功能强大,可以直接从word直接复制内容过来而不破坏原有的文档格式,非常适合做商品详情等内容的编辑工具。本文将展示如何在php高性能框架webman中使用summernote编辑器。 下载 去Bootstrap 中文网、Summernote、jQuery官网…...
jQuery里添加事件 (代码)
直接上代码 <!DOCTYPE html> <html><head></head><body><input type"text" placeholder"城市" id"city" /><input type"button" value"添加" id"btnAdd" /><ul id…...
Java数组的使用
Java数组的使用 前言一、数组基本用法什么是数组注意事项创建数组基本语法代码示例注意事项 数组的使用代码示例获取长度 & 访问元素注意事项 下标越界遍历数组使用 for-each 遍历数组 二、数组作为方法的参数基本用法代码示例打印数组内容 理解引用类型代码示例参数传内置…...
如何参与github开源项目并提交PR
👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,目前工作于上海某电商服务公司…”); 📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正&…...
拼多多携手中国农业大学,投建陕西佛坪山茱萸科技小院
5月16日下午,中国农业大学陕西佛坪山茱萸科技小院在佛坪县银厂沟村揭牌。佛坪县素有“中国山茱萸之乡”的美誉,是全国山茱萸三大基地之一,当地山茱萸是国家地理标志产品,山茱萸肉产量位居全国第二。 为充分发挥佛坪县得天独厚的山…...
技术前沿 |【自回归视觉模型ImageGPT】
自回归视觉模型ImageGPT 引言一、ImageGPT的基本原理与创新之处二、ImageGPT在图像生成、理解等视觉任务上的应用三、ImageGPT对后续视觉Transformer模型发展的影响四、ImageGPT的深入应用 引言 在人工智能的飞速发展中,视觉模型作为其中一个重要的分支,…...
Manjaro linux install RedisGUI (RedisInsight)亲测2024-5-25
Arch 用户仓库(Arch User Repository)(AUR) 是用户选择 基于 Arch Linux 的系统 的一个主要理由。你可以在 AUR 中访问到大量的附加软件。 (LCTT 译注:AUR 中的 PKGBUILD 均为用户上传且未经审核,使用者需要自负责任,在构建软件包前请注意检…...
debian/control文件中常见字段的介绍
1 简介 在Debian或基于Debian的发行版中,debian/control文件是软件包管理的关键部分。它包含了软件包的各种元数据和安装脚本信息,用于软件包管理系统(如dpkg)识别如何处理该软件包。以下是debian/control文件中常见字段的详细介…...
c++题目_农场和奶牛
𝐵B 头奶牛 (1≤𝐵≤25000)(1≤B≤25000),有 𝑁(2𝐵≤𝑁≤50000)N(2B≤N≤50000) 个农场,编号 11 到 𝑁N,有 𝑀(𝑁−1≤𝑀≤100000)M(…...
DDD领域设计在“图生代码”中的应用实践
前言 领域驱动设计(简称 ddd)概念来源于2004年著名建模专家Eric Evans 发表的他最具影响力的书籍:《领域驱动设计——软件核心复杂性应对之道》(Domain-Driven Design –Tackling Complexity in the Heart of Software),简称Evans DDD。领域…...
LabVIEW舱段测控系统开发
LabVIEW舱段测控系统开发 在航空技术飞速发展的当下,对于航空器的测控系统的需求日益增加,特别是对舱段测控系统的设计与实现。开发了一款基于LabVIEW开发的舱段测控系统,包括系统设计需求、系统组成、工作原理以及系统实现等方面。 开发了…...
[leetcode]第 n个丑数
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。 示例: 输入: n 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 1 2 3 说明: 1 是丑数。 n 不超过1690。 class Solution {public…...
STM32-电灯,仿真
目录 1.配置vscode 2.新创建软件工程 3.仿真 4.源码 5.运行效果 1.配置vscode http://t.csdnimg.cn/BvCLx 安装 C/C Extension Pack 安装 Embedded IDE 安装 Keil MDK 配置路径 2.新创建软件工程 下拉找到对应的 输入项目名字,选择项目所在文件夹即可 3.仿真 一路新…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
