当前位置: 首页 > news >正文

【C++】分治-快速排序算法习题

在这里插入图片描述
🎆个人主页:夜晚中的人海

在这里插入图片描述

今日语录:你有多自信,世界就有多相信你!你有多坚持,成功就有多眷顾你!

文章目录

  • ⭐一、颜色分类
  • 🏠二、排序数组
  • 🚀三、数组中的第K个最大元素
  • 🏖️四、最小的K个数

⭐一、颜色分类

题目链接:颜色分类

题目内容:

在这里插入图片描述

解题思路:
1.使用快排的思想,定义三个指针,分别是left(初始化为-1,用于标记0序列末尾)i(初始化为0,用于扫描整个数组)right(初始化为数组大小n,标记2序列的起始位置)

2.在 i 扫描数组时,我们就将数组分成三块区域:[0,left]区间表示0元素,[left + 1,i - 1]表示1元素,[i,right - 1]表示代排列元素,[right,n]表示2元素

代码实现:

class Solution {
public:void sortColors(vector<int>& nums) {int left = -1,i = 0,right = nums.size();while(i < right){if(nums[i] == 0){swap(nums[++left],nums[i++]);}else if(nums[i] == 1)i++;else{swap(nums[--right],nums[i]);}}}
};

🏠二、排序数组

题目链接:排序数组

题目内容:

在这里插入图片描述

解题思路:
1.使用数组分三块区域以及随机选择基准值的快速排序方法

2.将产生的随机数转化为随机下标,按照划分区域规则,将数组划分成:[l,left],[left + 1,right - 1],[right,r]

3.然后递归处理左区域和右区域,最终得到结果

代码实现:

class Solution {
public:vector<int> sortArray(vector<int>& nums) {srand(time(NULL));qsort(nums,0,nums.size() - 1);return nums;}void qsort(vector<int>& num,int l,int r){if(l >= r)return;int key = getrandom(num,l,r);//将数组划分成三块区域//[l,left][left + 1,right - 1][right,r]int i = l,left = l - 1,right = r + 1;while(i < right){if(num[i] < key){swap(num[++left],num[i++]);}else if(num[i] == key)i++;else{swap(num[--right],num[i]);}}//递归排序左右区间qsort(num,l,left);qsort(num,right,r);}//获取随机值int getrandom(vector<int>& num,int left,int right){int r = rand() % (right - left + 1) + left;return num[r];}
};

🚀三、数组中的第K个最大元素

题目链接:数组中的第K个最大元素

题目内容:

在这里插入图片描述

解题思路:
1.根据快排的思想,定义三个指针,将数组分成三块

2.然后通过计算每一块区域内元素的个数,从而推断出我们要找的第k大元素在哪一块区域,然后到相应的区域去寻找结果

代码实现:

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,i = l,right = r + 1;//将数组分成三块区域//[l,left][left + 1,right - 1][right,r]while(i < right){if(nums[i] < key){swap(nums[++left],nums[i++]);}else if(nums[i] == key){i++;}else{swap(nums[--right],nums[i]);}}//分情况讨论int c = r - right + 1,b = right - left - 1;if(c >= k)return qsort(nums,right,r,k);else if(b + c >= k)return key;elsereturn qsort(nums,l,left,k - b - c);}//获取随机值int getrandom(vector<int>& nums,int left,int right){return nums[rand() % (right - left + 1) + left];}
};

🏖️四、最小的K个数

题目链接:最小的K个数

题目内容:

在这里插入图片描述

解题思路:
1.运用快排的思想,跟上一个题目的解法类似,也是定义三个指针

2.将数组划分三块区域,然后通过计算每一块区域中元素的个数确定我们最小的第k个数在第几块区域,然后在这块区域找到结果并返回

代码实现:

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>& nums,int l,int r,int k){if(l >= r)return;//随机获取基准值int key = getrandom(nums,l,r);//将数组划分三块区域int left = l - 1,i = l,right = r + 1;    while(i < right){if(nums[i] < key){swap(nums[++left],nums[i++]);}else if(nums[i] == key){i++;}else{swap(nums[--right],nums[i]);}}//分类讨论int a = left - l + 1,b = right - left - 1;if(a >= k)qsort(nums,l,left,k);else if(a + b >= k)return;elseqsort(nums,right,r,k - a - b);}//获取随机值int getrandom(vector<int>& nums,int left,int right){return nums[rand() % (right - left + 1) + left];}
};

今天的分享就到这里啦,希望可以帮到您,感谢您的阅读,我们下期再见!

http://www.dtcms.com/a/568682.html

相关文章:

  • MySQL第四次作业(索引、视图)
  • Partial Prompt Templates in LangChain
  • 泉州网站平台建设公司网站建设素材图
  • 计算机技术员网站建设怎么网站底部 设计
  • 第50届ICPC亚洲区域赛·成都站,非凸科技持续护航顶尖赛事
  • 企业微信自建应用开发详细教程,如何获取授权链接?如何使用js-sdk?
  • html css js网页制作成品——高定晚礼服HTML+CSS网页设计(5页)附源码
  • 蓝牙钥匙 第43次 特殊用户群体场景下的汽车数字钥匙系统:包容性设计与技术创新
  • 万网如何建设购物网站wordpress分类目录 菜单 页面
  • 智能网联汽车 HD map架构解析
  • HTML常用单标签速查手册
  • 告别算法死记硬背,Hello-Algo 让抽象知识变直观,搭配cpolar穿透工具更自由
  • Go从入门到精通(27) - 并行任务处理器
  • Claude Code 使用 MiniMax M2 模型
  • Auto CAD二次开发——复制和旋转图形对象
  • 全屏响应式网站模板网站seo综合公司
  • php做简单网站教程视频教程企业门户网站模板 下载
  • Rust开发实战之WebSocket通信实现(tokio-tungstenite)
  • 编译缓存利器 ccahce、sccahce
  • Rust开发实战之使用 Reqwest 实现 HTTP 客户端请求
  • 各大公司开源网站广州出台21条措施扶持餐饮住宿
  • gmt_create为啥叫gmt
  • 从 NGINX 到 Kubernetes Ingress:现代微服务流量管理实战
  • 【C++】继承(2):继承与友元,静态成员,多继承黑/白盒复用
  • css实战:常用伪元素选择器介绍
  • 4.4 路由算法与路由协议【2013统考真题】
  • 营销型网站建设需要备案吗上饶网站建设企业
  • 福建网站建设科技有限公司品牌建设还需持续力
  • 工业CMOS相机的原理及基础知识
  • 无人机电气隔离与抗干扰技术概述