【优选算法】DC-Quicksort-Mysteries:分治-快排的算法之迷

文章目录

  • 1.概念解析
  • 2.颜色分类
  • 3.排序数组
  • 4.数组中的第k个最大元素
  • 5.库存管理Ⅲ
  • 希望读者们多多三连支持
  • 小编会继续更新
  • 你们的鼓励就是我前进的动力!

本篇是优选算法之分治-快排,快排可以在更短的时间内完成相同规模数据的排序任务,大大提升了运算效率,空间复杂度在平均状况下仅为O(log N)

1.概念解析

🚩什么是分治-快排?

分治是核心思想,即将大问题拆解成形式相同的小问题来处理,从待排序数组里挑出一个元素当作基准,设置两个指针,一个从数组开头,一个从末尾出发,先把一个无序的数组划分成两个子数组,接着分别处理这两个子数组,随着递归深入,子数组越来越小,最终每个子数组只剩 1 个元素时天然有序,整个大数组也就完成排序

2.颜色分类

✏️题目描述:

在这里插入图片描述

✏️示例:

在这里插入图片描述

传送门:颜色分类

题解:

对于排序的题目,根据前些的学习我们一般都是想到冒泡排序等基础算法,但是此类算法对于带有重复性的排序很不友好,还是太慢了,因此对于这道题,也是一道经典的荷兰国旗问题,使用类似双指针算法中的移动零那道题的方法,划分区间比较排序,衍生出来了一种三划分排序算法,也叫作快速排序

💻第一步:

在这里插入图片描述

首先我们这题要排序的是0、1、2三个数字,所以划分为三个区间,分别是小于1的区间等于1的区间大于1的区间left表示标记左区间的指针i表示扫描区间指针right表示标记右区间的指针

💻第二步:

在这里插入图片描述

前提条件left = -1, right = n,根据i扫描的区间,可以分为三种情况如果遇到0,要放在左区间left先++,和i所指的元素互换,然后i++扫描下一个元素;如果遇到1,本来就要放在中间区间,所以不用操作i++扫描下一个元素;如果遇到2,要放在右区间right先--,和i所指的元素互换,注意i不能++,因为此时交换过来的元素还没扫描过,要再判断一次。right和i相遇时停止扫描

💻代码实现:

#include <iostream>
#include <vector>
using namespace std;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] == 2){swap(nums[--right], nums[i]);}else{i++;}}}
};

3.排序数组

✏️题目描述:

在这里插入图片描述

✏️示例:

在这里插入图片描述

传送门:排序数组

题解:

在这里插入图片描述

本题其实和三色划分的道理是相同的,只不过该题才是真正的将快速排序方法效率最大化,能普及到大部分的题目上,重点是要选取基准元素划分区间

💻第一步:

在这里插入图片描述

根据算法导论的期望严谨证明,发现用随机的方式选取基准元素是最优的算法,因此我们可以使用rand()随机函数,最开始调用qsort时,此时计算随机数的范围就是基于 [l, r] 这个初始区间,left作为基准偏移,让随机选取的索引能落在这个完整初始区间内

💻第二步:

在这里插入图片描述

既然已经选取完基准元素,那么划分的过程和三色划分是一样的,此时要注意,第一轮划分完后,left在基准元素左边一位right在基准元素右边一位,此时就完成了两个字区间的划分,但是左右两个区间只是大于或小于区间内的数据排序还是乱的,所以还要对左右两个区间进行相同的排序,依次往复,每次排序都能确定一个基准元素的位置

💻代码实现:

#include <iostream>
#include <vector>
#include <ctime>
using namespace std;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){swap(nums[--right], nums[i]);}else{i++;}}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];}
};

4.数组中的第k个最大元素

✏️题目描述:

在这里插入图片描述

✏️示例:

在这里插入图片描述

传送门:数组中的第k个最大元素

题解:

在这里插入图片描述

本题要求找数组中的第k个最大元素,本质是快速排序算法中的快速选择算法,该方法同样适用第k小前k大前k小

💻细节问题:

在这里插入图片描述

快速选择算法和快速排序基本上一样,唯一不同的是要在递归时选择区间若c>=k,说明第k大落在大于基准元素的这段区间,那么只在这段区间寻找即可;若b+c>=k说明第k大就在等于基准元素这段区间,即等于基准元素;若前面两种都不成立,那么第k大一定落在比基准元素小的区间,因此在整个区间上找第k大相当于在左区间上找第k-b-c大

💻代码实现:

#include <iostream>
#include <vector>
#include <ctime>
using namespace std;class Solution 
{
public:int findKthLargest(vector<int>& nums, int k) {srand(time(NULL));return qsort(nums, 0, nums.size() - 1, k);}int qsort(vector<int> nums, int l, int r, int k){if (l == r) return nums[l];int key = getRandom(nums, l, r);int left = l - 1, right = r + 1, i = l;while (i < right){if (nums[i] < key){swap(nums[++left], nums[i++]);}else if (nums[i] > key){swap(nums[--right], nums[i]);}else{i++;}}int c = r - right + 1, b = right - left - 1;if (c >= k){return qsort(nums, right, r, k);}else if (c + b >= k){return key;}else{return qsort(nums, l, left, k - b - c);}}int getRandom(vector<int> nums, int left, int right){int r = rand();return nums[r % (right - left + 1) + left];}
};

5.库存管理Ⅲ

✏️题目描述:

在这里插入图片描述

✏️示例:

在这里插入图片描述

传送门:库存管理Ⅲ

题解:

这题其实也是一样的,要求一个区间内的数,只要求第k个数的位置,然后计算这个区间间的长度就行了

💻代码实现:

#include <iostream>
#include <vector>
#include <ctime>
using namespace std;class Solution 
{
public:vector<int> inventoryManagement(vector<int>& stock, int cnt){srand(time(NULL));qsort(stock, 0, stock.size() - 1, cnt);return { stock.begin(),stock.begin() + cnt };}void qsort(vector<int>& stock, int l, int r, int cnt){if (l >= r) return;int key = getRandom(stock, l, r);int left = l - 1, right = r + 1, i = l;while (i < right){if (stock[i] < key){swap(stock[++left], stock[i++]);}else if (stock[i] > key){swap(stock[--right], stock[i]);}else{i++;}}int a = left - l + 1, b = right - left - 1;if (a > cnt){return qsort(stock, l, left, cnt);}else if (a + b >= cnt){return;}else{return qsort(stock, right, r, cnt - b - a);}}int getRandom(vector<int>& stock, int l, int r){return stock[rand() % (r - l + 1) + l];}
};

希望读者们多多三连支持

小编会继续更新

你们的鼓励就是我前进的动力!

请添加图片描述

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

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

相关文章

浅谈云计算09 | 服务器虚拟化

服务器虚拟化基础 一、虚拟化的定义二、系统虚拟化三、服务器虚拟化的核心要义四、典型实现&#xff1a;探索不同路径五、全虚拟化与半虚拟化六、主流服务器虚拟化技术 一、虚拟化的定义 虚拟化是一种将物理资源抽象为逻辑资源的技术&#xff0c;通过在物理硬件与操作系统、应…

解析OVN架构及其在OpenStack中的集成

引言 随着云计算技术的发展&#xff0c;虚拟化网络成为云平台不可或缺的一部分。为了更好地管理和控制虚拟网络&#xff0c;Open Virtual Network (OVN) 应运而生。作为Open vSwitch (OVS) 的扩展&#xff0c;OVN 提供了对虚拟网络抽象的支持&#xff0c;使得大规模部署和管理…

第三十六章 Spring之假如让你来写MVC——拦截器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…

CSS 盒模型

盒模型 CSS盒模型是网页布局的核心概念之一&#xff0c;它描述了网页元素的物理结构和元素内容与周围元素之间的关系。根据W3C规范&#xff0c;每个HTML元素都被视为一个矩形盒子&#xff0c;这个盒子由以下四个部分组成&#xff1a; 内容区&#xff08;Content area&#xff…

JVM:ZGC详解(染色指针,内存管理,算法流程,分代ZGC)

1&#xff0c;ZGC&#xff08;JDK21之前&#xff09; ZGC 的核心是一个并发垃圾收集器&#xff0c;所有繁重的工作都在Java 线程继续执行的同时完成。这极大地降低了垃圾收集对应用程序响应时间的影响。 ZGC为了支持太字节&#xff08;TB&#xff09;级内存&#xff0c;设计了基…

OpenCV基于均值漂移算法(pyrMeanShiftFiltering)的水彩画特效

1、均值漂移算法原理 pyrMeanShiftFiltering算法结合了均值迁移&#xff08;Mean Shift&#xff09;算法和图像金字塔&#xff08;Image Pyramid&#xff09;的概念&#xff0c;用于图像分割和平滑处理。以下是该算法的详细原理&#xff1a; 1.1 、均值迁移&#xff08;Mean …

【数学】概率论与数理统计(五)

文章目录 [toc] 二维随机向量及其分布随机向量离散型随机向量的概率分布律性质示例问题解答 连续型随机向量的概率密度函数随机向量的分布函数性质连续型随机向量均匀分布 边缘分布边缘概率分布律边缘概率密度函数二维正态分布示例问题解答 边缘分布函数 二维随机向量及其分布 …

四 BH1750 光感驱动调试2

之前调通了用户态接口,android 使用还是不方便,要包装jni使用。 这里集成了内核 iio 驱动 ,提供 sys-fs 文件接口 可供固件以及 ANDROID 应用层使用 一 驱动集成 : 1.1 dts 修改 修改文件 : kernel/arch/arm64/boot/dts/rockchip/rp-rk3568.dts 在 i2c5 增加设备,如…

Redis持久化双雄

Redis持久化 Redis 的持久化是指将内存中的数据保存到硬盘&#xff0c;以防止服务器宕机导致数据丢失的机制。 redis 提供了两种持久化的方式&#xff0c;分别是RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09;。 RDB&#xff0c;简…

工业视觉2-相机选型

工业视觉2-相机选型 一、按芯片类型二、按传感器结构特征三、按扫描方式四、按分辨率大小五、按输出信号六、按输出色彩接口类型 这张图片对工业相机的分类方式进行了总结&#xff0c;具体如下&#xff1a; 一、按芯片类型 CCD相机&#xff1a;采用电荷耦合器件&#xff08;CC…

数字证书管理服务

阿里云数字证书管理服务&#xff08;Aliyun Certificate Management Service, ACM&#xff09;是一种云端服务&#xff0c;专门用于帮助企业管理和颁发数字证书。数字证书是网络安全中的重要组成部分&#xff0c;它可以确保通信的安全性、身份认证以及数据的完整性。通过阿里云…

《跟我学Spring Boot开发》系列文章索引❤(2025.01.09更新)

章节文章名备注第1节Spring Boot&#xff08;1&#xff09;基于Eclipse搭建Spring Boot开发环境环境搭建第2节Spring Boot&#xff08;2&#xff09;解决Maven下载依赖缓慢的问题给火车头提提速第3节Spring Boot&#xff08;3&#xff09;教你手工搭建Spring Boot项目纯手工玩法…

Zookeeper概览

个人博客地址&#xff1a;Zookeeper概览 | 一张假钞的真实世界 设计目标 简单的&#xff1a;方便使用以实现复杂的业务应用。复制式的&#xff1a;跟Zookeeper协调的分布式进程一样&#xff0c;它也是在一组服务器上复制的。集群的每个节点间互相知道。它们维护一个状态数据在…

播放音频文件同步音频文本

播放音频同步音频文本 对应单个文本高亮显示 使用audio音频文件对应音频文本资源 音频文本内容&#xff08;Json&#xff09; [{"end": 4875,"index": 0,"speaker": 0,"start": 30,"text": "70号二啊,","tex…

React中ElementFiber对象、WorkInProgress双缓存、ReconcileRenderCommit、第一次挂载过程详解

基础概念 Element对象与Fiber对象 Element对象与Fiber对象 Element 对象 定义 React 的 Element 对象是一个描述用户界面&#xff08;UI&#xff09;的普通 JavaScript 对象&#xff0c;通常由 React.createElement 或 JSX 语法生成。 作用 它是 React 应用中的一种描述 …

【airtest】自动化入门教程Poco元素定位

1. 前言 本文将详细讲解Poco控件定位的各种方式&#xff0c;利用这些方法可以帮助我们编写出目标控件的定位脚本。我们在IDE录制的poco脚本&#xff0c;常见的都是类似 poco(“star_single”).click()这样的脚本&#xff0c;其中 poco(“star_single”) 这块就属于Poco控件定位…

2025年01月13日Github流行趋势

1. 项目名称&#xff1a;Jobs_Applier_AI_Agent 项目地址url&#xff1a;https://github.com/feder-cr/Jobs_Applier_AI_Agent项目语言&#xff1a;Python历史star数&#xff1a;25929今日star数&#xff1a;401项目维护者&#xff1a;surapuramakhil, feder-cr, cjbbb, sarob…

[免费]SpringBoot+Vue新能源汽车充电桩管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue新能源汽车充电桩管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue新能源汽车充电桩管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息化时代的到来&#xff0…

【C++】字符串中的 insert 方法深层分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;一、基础知识&#xff1a;insert 方法概述功能描述函数原原型基本规则 &#x1f4af;二、例子解析例子 1&#xff1a;插入一个 std::string分析 例子 2&#xff1a;插入一个…

G-Star Landscape 2.0 重磅发布,助力开源生态再升级

近日&#xff0c;备受行业瞩目的 G-Star Landscape 迎来了其 2.0 版本的发布&#xff0c;这一成果标志着 GitCode 在开源生态建设方面又取得了重要进展。 G-Star Landscape仓库链接&#xff1a; https://gitcode.com/GitCode-official-team/G-Star-landscape 2024 GitCode 开…