首页/新闻资讯/正文详情

优选算法的妙思之流:分治——快排专题

发布时间:2026/9/27 7:31:46 来源:云帆数科 栏目:资讯中心
优选算法的妙思之流:分治——快排专题
专栏算法的魔法世界个人主页手握风云目录一、快速排序二、例题讲解2.1. 颜色分类2.2. 排序数组2.3. 数组中的第K个最大元素2.4. 库存管理 III一、快速排序分治简单理解为“分而治之”将一个大问题划分为若干个子问题直到这个子问题能够快速解决。我们之前的快速排序是选出一个数作为基准值然后将一个数组划分为两个子序列一个序列基准值另一个基准值。但这种算法在数据特别大的时候是会超时的。所以我们这里要使用更优秀的三块划分和随机选择基准元素的算法。二、例题讲解2.1. 颜色分类这道题我们可以参照移动零里面的划分策略。移动零里面是利用双指针将数组分为0区域和非0区域这道题我们也可以使用三个指针left、right、i来将其划分为0、1、2区域。其中i用来遍历数组left用来标记0区域的最右侧right用来标记2区域的最左侧。接下来进行分类讨论如果nums[i]0我们让nums[left1]与nums[i]进行交换然后ileft就能保证[left1,i-1]区间还都是1还可能有一种极端情况就是ileft1自身与自身进行交换还是得需要left和i综上我们就可以写成nums[left]与nums[i]进行交换。如果nums[i]1我们直接就可以i就可以。如果nums[i]2时right的移动也可以参照上面left的处理--right但i不能因为i右侧是未遍历的区间如果i就会跳过这个元素。当iright时结束循环。完整代码实现class Solution { public void sortColors(int[] nums) { int left -1, right nums.length, i 0; while (i right) { if (nums[i] 0) swap(nums, left, i); else if (nums[i] 1) i; else if (nums[i] 2) swap(nums, --right, i); } } private void swap(int[] nums, int i, int j) { int tmp nums[i]; nums[i] nums[j]; nums[j] tmp; } }2.2. 排序数组这道题如果我们直接采用之前的快排思想是会超时的因为如果数组里的元素都等于基准值key这样数组元素就会跑到数组的最右侧导致时间复杂度会退化成。我们接下来利用数组分三块的思想将其划分为3个区域keykeykey。这样当基准值都等于key时时间复杂度直接降为。接下来就是如何随机选择基准值。我们需要在数组下标中等概率地选择一个下标那么我们就可以利用随机数种子利用公式r%(right-left1)left求出随机下标。完整代码实现class Solution { public int[] sortArray(int[] nums) { Quicksort(nums, 0, nums.length - 1); return nums; } private void Quicksort(int[] nums, int l, int r) { if (l r) return;//作为递归结束的条件 //数组分三块 int key nums[new Random().nextInt(r - l 1) l]; int left l - 1, right r 1, i l; while (i right) { if (nums[i] key) swap(nums, left, i); else if (nums[i] key) i; else if (nums[i] key) swap(nums, --right, i); } Quicksort(nums, l, left); Quicksort(nums, right, r); } private void swap(int[] nums, int i, int j) { int tmp nums[i]; nums[i] nums[j]; nums[j] tmp; } }2.3. 数组中的第K个最大元素因为这道题让我们用时间复杂度为所以我们的思路很明显要使用快速选择排序也就是上一题的数组分三块与随机选择基准元素。那么这个第K大的元素就有可能落在三个区域内我们设三个区域的元素个数分别为a、b、c。如果ck那我们就直接去key的这个区域去寻找如果bck就直接返回key如果前两个都不成立就去key这个区间去寻找第k-b-c大的元素。完整代码实现class Solution { public int findKthLargest(int[] nums, int k) { return Quicksort(nums, 0, nums.length - 1, k); } private int Quicksort(int[] nums, int l, int r, int k) { if (l r) return nums[l]; //随机选择基准元素 int key nums[new Random().nextInt(r - l 1) l]; //根据基准元素把数组分为三块 int left l - 1, right r 1, i l; while (i right) { if (nums[i] key) swap(nums, left, i); else if (nums[i] key) i; else if (nums[i] key) swap(nums, --right, i); } //分类讨论 //区间:[l,left],[left1,right-1],[right,r] int b right - left - 1, c r - right 1; if (c k) return Quicksort(nums, right, r, k); else if (b c k) return key; else return Quicksort(nums, l, left, k - b - c); } private void swap(int[] nums, int i, int j) { int tmp nums[i]; nums[i] nums[j]; nums[j] tmp; } }2.4. 库存管理 III题目就是求数组中的最小的cnt个数。第一种解法可以使用Arrays.sort()方法来对数组进行排序找出前k个元素第二种解法利用大根堆创建一个大小为k的大根堆将数组的前k个元素丢进大根堆中然后再将数组剩余的元素与堆顶元素比较如果小就交换并调整堆最后堆里面就是最小的k个数第三个解法就是快速选择算法。第一种解法的时间复杂度为第二种解法的时间复杂度为第三中解法的时间复杂度为。按照上一题的思路将数组分为三块三个区间内元素的个数分别为a、b、c。如果acnt那么我们只需要去key的区间去寻找如果abcnt此时的cnt一定是大于a的那么最小的cnt个数一定位于左侧两个区间而中间区间又都是等于key的所以不需要递归直接如果前两个都不成立直接去最右侧的区间去寻找第cnt-a-b个元素。完整代码实现class Solution { public int[] inventoryManagement(int[] stock, int cnt) { Quicksort(stock,0,stock.length - 1,cnt); int[] ret new int[cnt]; for (int i 0; i cnt; i) { ret[i] stock[i]; } return ret; } private void Quicksort(int[] nums, int l, int r, int k) { if(l r) return; //随机获取基准元素 int key nums[new Random().nextInt(r - l 1) l]; int left l - 1,right r 1,i l; //数组分三块 while(i right){ if(nums[i] key) swap(nums,left,i); else if (nums[i] key) i; else if (nums[i] key) swap(nums,--right,i); } //分类讨论 int a left - l 1,b right - left - 1; if(a k) Quicksort(nums,l,left,k); else if (a b k) return; else Quicksort(nums,right,r,k - a - b); } private void swap(int[] nums, int i, int j) { int tmp nums[i]; nums[i] nums[j]; nums[j] tmp; } }

相关推荐

镜面检测(Mirror Detection)介绍
镜面检测(Mirror Detection)介绍

文章目录一、镜面检测介绍二、术语表 glossary三、镜面检测模型1.通用型语义分割 / 边缘检测模型:EGNet、MINet、LDF、VST2.经典语义分割骨干网络:PSPNet、DANet、UperNet3.显著目标检测 (Salient Object Detection, SOD)4.玻璃检测 (glass detection)5.… · 2026/9/27 7:31:40

kube-prometheus 监控附加命名空间:通过 jsonnet 扩展 Prometheus 抓取范围与 ServiceMonitor 实战指南
kube-prometheus 监控附加命名空间:通过 jsonnet 扩展 Prometheus 抓取范围与 ServiceMonitor 实战指南

云原生可观测性指标监控监控大盘告警 【免费下载链接】kube-prometheus Use Prometheus to monitor Kubernetes and applications running on Kubernetes 项目地址: https://gitcode.com/gh_mirrors/ku/kube-prometheus 点击查看 免费下载 导读 在默认部署中&… · 2026/9/27 7:31:40

Longhorn 定时快照清理:snapshot-delete 与 snapshot-cleanup 任务类型实战指南
Longhorn 定时快照清理:snapshot-delete 与 snapshot-cleanup 任务类型实战指南

云原生存储高可用容器编排 【免费下载链接】longhorn Cloud-Native distributed storage built on and for Kubernetes 项目地址: https://gitcode.com/gh_mirrors/lo/longhorn 点击查看 免费下载 导读 Longhorn 的 RecurringJob(定时任务)… · 2026/9/27 7:31:40

做一个可以做问答的网站到底多少钱
做一个可以做问答的网站到底多少钱

做一个可以做问答的网站到底多少钱 改个需求建站公司拖一周,这种憋屈谁懂?你明明只改了个按钮颜色,对方却让你等“排期”。这时候你心里肯定在算账:自己做个可以做问答的网站,到底多少钱?是找外包花大几万,还是自己搭个系统省点钱?别急着下结论,今天… · 2026/9/27 8:15:47

elsa-core 中的 speckit-plan:从特性规格到实施计划的 AI 规划工作流实战指南
elsa-core 中的 speckit-plan:从特性规格到实施计划的 AI 规划工作流实战指南

后端工作流自动化流程编排低代码 【免费下载链接】elsa-core The Workflow Engine for .NET 项目地址: https://gitcode.com/gh_mirrors/el/elsa-core 点击查看 免费下载 本指南围绕 elsa-core 仓库中 .agents/skills/speckit-plan/SKILL.md 所定义的实施规划技能展… · 2026/9/27 8:15:29

GitHub Desktop 发布规划与排期全流程:从 Issue、里程碑到 Release 的工程化实践
GitHub Desktop 发布规划与排期全流程:从 Issue、里程碑到 Release 的工程化实践

开发工具桌面应用 【免费下载链接】desktop Fork of GitHub Desktop to support various Linux distributions 项目地址: https://gitcode.com/gh_mirrors/des/desktop 点击查看 免费下载 本文以 GitHub Desktop(desktop/desktop 开源仓库,本… · 2026/9/27 8:15:23

秋季膏方与传统药膳数字化归档 RAG 体系:两百料古方与现代禁忌实战
秋季膏方与传统药膳数字化归档 RAG 体系:两百料古方与现代禁忌实战

秋季膏方与传统药膳数字化归档 RAG 体系:两百料古方与现代禁忌实战在中国传统中医药食同源的宝库中,江南膏滋与时令药膳传承了数千年,凝结了历代名医调和阴阳、固护元气的绝妙智慧。 然而,传统的纸质药膳手抄本与古方善本&#xf… · 2026/9/27 8:15:16

AI爬虫抓不到网页怎么办?从robots.txt到SSR的完整排查与配置指南
AI爬虫抓不到网页怎么办?从robots.txt到SSR的完整排查与配置指南

你的网站在Google里能搜到,但用户在ChatGPT、Perplexity里问同样的问题,答案里从来没有你。打开服务器日志一看,GPTBot的请求记录是零。这不是内容质量问题,而是AI爬虫根本没读到你的页面,或者读了之后发现什么都没有。… · 2026/9/27 8:14:58

搞懂公司网站建设需要的材料,别再被坑了
搞懂公司网站建设需要的材料,别再被坑了

搞懂公司网站建设需要的材料,别再被坑了 很多老板一上来就问建站报价,结果做出来的网站丑得像90年代网吧主页。模板网站太丑不够用,更别提转化了。别急着比价,先看看你手里有没有这些“硬通货”。 1. 公司核心资料清单:别只给个Logo… · 2026/9/27 8:14:34

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码