分治——快速排序算法

news2025/1/8 4:48:06

例题一

解法(快排思想 - 三指针法使数组分三块):
算法思路:
类⽐数组分两块的算法思想,这⾥是将数组分成三块,那么我们可以再添加⼀个指针,实现数组分
三块。
设数组⼤⼩为 n ,定义三个指针 left, cur, right :
left :⽤来标记 0 序列的末尾,因此初始化为 -1
cur :⽤来扫描数组,初始化为 0
right :⽤来标记 2 序列的起始位置,因此初始化为 n
在 cur 往后扫描的过程中,保证:
[0, left] 内的元素都是 0
[left + 1, cur - 1] 内的元素都是 1
[cur, right - 1] 内的元素是待定元素;
[right, n] 内的元素都是 2
算法流程:
a. 初始化 cur = 0 left = -1 right = numsSize
b. 当 cur < right 的时候(因为 right 表⽰的是 2 序列的左边界,因此当 cur 碰到 right 的时候,说明已经将所有数据扫描完毕了),⼀直进⾏下⾯循环:
根据 nums[cur] 的值,可以分为下⾯三种情况:
i. nums[cur] == 0 ;说明此时这个位置的元素需要在 left + 1 的位置上,因此交 换 left + 1 cur 位置的元素,并且让 left++ (指向 0 序列的右边界),
cur++ (为什么可以 ++ 呢,是因为 left + 1 位置要么是 0 ,要么是 cur ,交换 完毕之后,这个位置的值已经符合我们的要求,因此 cur++ );
ii. nums[cur] == 1 ;说明这个位置应该在 left cur 之间,此时⽆需交换,直接让 cur++ ,判断下⼀个元素即可;
iii. nums[cur] == 2 ;说明这个位置的元素应该在 right - 1 的位置,因此交换 right - 1 与 cur 位置的元素,并且让 right-- (指向 2 序列的左边界),cur 不变(因为交换过来的数是没有被判断过的,因此需要在下轮循环中判断)
c. 当循环结束之后: [0, left] 表⽰ 0 序列; [left + 1, right - 1] 表⽰ 1 序列; [right, numsSize - 1]
表⽰ 2 序列。

例题二

解法(数组分三块思想 + 随机选择基准元素的快速排序):
算法思路:
我们在数据结构阶段学习的快速排序的思想可以知道,快排最核⼼的⼀步就是 Partition (分割数
据):将数据按照⼀个标准,分成左右两部分。
如果我们使⽤荷兰国旗问题的思想,将数组划分为 左 中 右 三部分:左边是⽐基准元素⼩的数据,
中间是与基准元素相同的数据,右边是⽐基准元素⼤的数据。然后再去递归的排序左边部分和右边
部分即可(可以舍去⼤量的中间部分)。
在处理数据量有很多重复的情况下,效率会⼤⼤提升。
算法流程:
随机选择基准算法流程:
函数设计:int randomKey(vector<int>& nums, int left, int right)
a. 在主函数那⾥种⼀颗随机数种⼦;
b. 在随机选择基准函数这⾥⽣成⼀个随机数;
c. 由于我们要随机产⽣⼀个基准,因此可以将随机数转换成随机下标:让随机数 % 上区间⼤⼩,
然后加上区间的左边界即可。
快速排序算法主要流程:
a. 定义递归出⼝;
b. 利⽤随机选择基准函数⽣成⼀个基准元素;
c. 利⽤荷兰国旗思想将数组划分成三个区域;
d. 递归处理左边区域和右边区域。

例题三

解法(快速选择算法):
算法思路:
在快排中,当我们把数组「分成三块」之后: [l, left] [left + 1, right - 1] [right, r] ,我们可以通过计算每⼀个区间内元素的「个数」,进⽽推断出我们要找的元素是在「哪⼀个区间」⾥⾯。
那么我们可以直接去「相应的区间」去寻找最终结果就好了。

例题四

路: 在快排中,当我们把数组「分成三块」之后: [l, left] [left + 1, right - 1]  [right, r] ,我们可以通过计算每⼀个区间内元素的「个数」,进⽽推断出最⼩的 k 个数在哪 些区间⾥⾯。 那么我们可以直接去「相应的区间」继续划分数组即可。

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

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

相关文章

快速了解LED开关电源的常见故障及如何解决

LED开关电源应用广泛&#xff0c;在我们的生活和工作中无处不在。然而在LED开关电源的实际使用中会出现一些问题和故障&#xff0c;可能会造成电源和LED灯受损。本文纳米软件将为大家介绍常见的LED开关电源的故障以及解决方法。 1. 输出电流不稳定 LED开关电源输出电流不稳定通…

Nuxt2:node-sass替换为sass,避免因依赖python导致Can‘t find Python executable “python“错误

一、问题描述 由于node-sass依赖于python&#xff0c;在缺少python环境时&#xff0c;会报以下错误&#xff1a; npm ERR! gyp ERR! stack Error: Cant find Python executable "python", you can set the PYTHON env variable.当服务器环境不想安装python或者不方…

Vitis报错:fatal error: xxx.h: No such file or directory.

在跑vitis工程文件时出现fatal error: xxx.h: No such file or directory.的错误&#xff0c;出现这种情况的主要是出现在大家用了自定义IP。 记住如果时出现Makefile出现错误&#xff0c;并不是你的代码问题而是软件bug&#xff0c;我们需要更改一些文件才能正常跑。 讲解一下…

如何快速下载GEO数据并获取其表达矩阵与临床信息 | 附完整代码 + 注释

GEO数据库可以说是大家使用频率贼高的数据库啦&#xff01;那它里面的数据怎么下载大家知道嘛&#xff01;今天给大家展示一种快速获取它的表达矩阵和临床信息的方法&#xff01; 话不多说&#xff01;咱们直接开始&#xff01; GEO编号获取 在GEO数据库中&#xff0c;你找到…

水牛社:宝妈副业,不仅赚钱更成长:一段充实之旅

大家好&#xff01;作为一名90后的全职宝妈&#xff0c;今天非常荣幸能够与大家分享我的互联网赚钱经验。趁着宝宝午睡的宝贵时光&#xff0c;我抓紧写下了这篇文章&#xff0c;虽时间紧凑&#xff0c;但我会力求内容清晰明了。 大约从2022年4月开始&#xff0c;我踏上了互联网…

【Node.js】定时任务

Cron表达式 Cron表达式是用于表示定时任务的一种语法。它由6个字段组成&#xff0c;按顺序分别表示分、时、日、月、周几和年份。 * * * * * * ┬ ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ │ │ │ │ │ │ └── 星期…

【智能算法】蛇优化算法(SO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;FA Hashim等人受到蛇特殊交配行为启发&#xff0c;提出了蛇优化算法&#xff08;Snake Optimizer, SO&#xff09;。 2.算法原理 2.1算法思想 SO算法模拟蛇类的战斗与交配模式…

社会实践 | 暑期社会实践投稿攻略,凤凰网等(央媒/官媒)投稿入口,不同频道发稿详细报价

作为媒体行业的从业者&#xff0c;我们都清楚凤凰网等央媒/官媒的影响力和号召力。如果能在这些平台上发表文章&#xff0c;不仅可以增加个人影响力&#xff0c;还有利于传播自己的观点和思想。然而&#xff0c;很多人可能不知道如何才能在这些媒体上投稿。今天&#xff0c;我要…

错误记录

Packet for query is too large 错误原因 一般是没有修改Mysql允许传输的最大数据包大小&#xff0c;使用 SHOW VARIABLES LIKE %max_allowed_packet%;可以看到默认的大小&#xff0c;一般默认为1M。 处理方法 暂时修改&#xff1a;重启mysql后失效 --修改为10M set global…

鸿蒙开发实例:【demo-搜索历史记录】

图片演示效果&#xff1a; 鸿蒙OS开发更多内容↓点击HarmonyOS与OpenHarmony技术鸿蒙技术文档开发知识更新库gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md在这。或mau123789学习&#xff0c;是v喔 代码演示&#xff1a; // 注&#xff1a;当前代码基于宽度为…

开箱即用的中后台管理模版,建议收藏!

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ 原文作者&#xff1a;前端充电宝 大家好&#xff0c;我是白特。 今天来推荐几款开箱即用的中后台管理模版&#xff01; Vue Element Admin vue-element-admin 是一个后台前端解决方案&#xff0c;它基于 vue 和 …

C++ 迭代器与反向迭代器

目录 一&#xff0c;什么是迭代器 1&#xff0c;定义 2&#xff0c;迭代器的设计思维 3&#xff0c;迭代器种类 二&#xff0c;迭代器与容器 1&#xff0c;容器中的迭代器 2&#xff0c;迭代器失效问题 三&#xff0c;迭代器的类型萃取&#xff08;traits&#xff09; …

稀碎从零算法笔记Day28-LeetCode:零钱兑换

前言&#xff1a;鸽了好多天了哈哈哈&#xff0c;虽然C站没更但是LC还是坚持刷的&#xff0c;任重道远啊&#xff01;(可恶的寝室熄灯) 题型&#xff1a;动态规划 链接&#xff1a;322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述…

城市内涝排水系统最新模型:慧天【HTWATER】与SWMM完美耦合

查看原文>>> 城市内涝水文水动力模型&#xff1a;慧天【HTWATER】 【城市内涝水文水动力模型介绍】 慧天排水数字化分析平台针对城市排水系统基础设施数据管理的需求&#xff0c;以及水文、水力及水质模拟对数据的需求&#xff0c;实现了以数据库方式对相应数据的存…

静态资源动态访问的细节补充import()与new URL

教学视频的补充 静态资源的动态访问【渡一教育】_哔哩哔哩_bilibili import里若用引号拼接,那么打包结果不会有图片 细节1:得用es6的反单引号才可以 细节2:不能以变量结尾 var p 12 //错误import(./assets/ p .jpg).then(res > {console.log(res, res);}) //正确var p…

201812 CSP认证 | CIDR合并

CIDR合并 难是真的不难但是也写了我几个小时服了 这道题在有计网的基础上就很好理解了&#xff0c;没有在格式上有任何刁难你的。这里不讲背景了 官网提交结果以及满分代码如下&#xff1a; #include<bits/stdc.h> using namespace std; typedef long long ll; typedef…

Qt Design Studio 软件怎么用(详细+通俗+有趣)

建议&#xff1a;本文长期更新&#xff0c;建议点赞/收藏&#xff01; 1. 啥是Qt Design Studio&#xff1f; Qt Design Studio 是一个用于设计和开发用户界面的工具&#xff0c;特别适合开发跨平台应用程序。它结合了UI设计和开发的工作流程&#xff0c;使得设计师和开发者可…

​奶茶店小程序有哪些功能

​奶茶店作为饮品行业的一种热门经营模式&#xff0c;拥有自己的小程序可以带来诸多便利和增长机会。在这篇文章中&#xff0c;我们将探讨奶茶店小程序应该具备的功能&#xff0c;以满足消费者的需求&#xff0c;提升店铺的运营效率和用户体验。 1. **在线订购功能**&#xff…

linux文本三剑客 --- grep、sed、awk

1、grep grep&#xff1a;使用正则表达式搜索文本&#xff0c;将匹配的行打印出来&#xff08;匹配到的标红&#xff09; 命令格式&#xff1a;grep [option] pattern file <1> 命令参数 -A<显示行数>&#xff1a;除了显示符合范本样式的那一列之外&#xff0c;并…

Windows/Mac 上的 7 个顶级数据恢复软件榜单

数据恢复软件可帮助您从众多存储设备中恢复损坏或删除的数据。该文件恢复软件可以恢复文件、文档、视频、照片等。这些应用程序支持许多标准文件格式&#xff0c;如 PNG、RTF、PDF、HTML、JPG、MP3 等。以下是具有流行功能的顶级数据恢复软件列表和网站链接。磁盘恢复软件列表包…