分治——快速排序算法

例题一

解法(快排思想 - 三指针法使数组分三块):
算法思路:
类⽐数组分两块的算法思想,这⾥是将数组分成三块,那么我们可以再添加⼀个指针,实现数组分
三块。
设数组⼤⼩为 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.mzph.cn/news/772692.shtml

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

相关文章

数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;数据分析系统化教学&#xff0c;零基础到进阶实战 景天的主页&#xff1a;景天科技苑 文章目录 Streamlit什么是streamli…

Godot 学习笔记(5):国际化多语言翻译,包含常用10种语言机翻!

文章目录 前言国际化翻译Api选择小牛测试 语言选择代码逻辑实体对象翻译帮助类导出模板读取文件翻译测试多语言测试 综合翻译文件准备测试代码测试结果 完整代码实体类翻译帮助类网络帮助类 最终效果翻译前翻译中翻译后 总结 前言 为了面向更大的市场&#xff0c;国际化是肯定…

毫米波雷达简介

毫米波雷达简介 附赠自动驾驶学习资料和量产经验&#xff1a;链接 1. 概述 1.1 发展历史 RADAR是RAdio Detection And Ranging的缩写。 1936年1月&#xff0c;英国架起了第一个雷达站&#xff0c;用于监测德国战机。从此之后&#xff0c;雷达技术开始蓬勃发展。 雷达的频段很…

软件测试基础(1)

软件测试的生命周期 软件测试的生命周期: 需求分析 -> 测试计划 -> 测试设计, 测试开发 -> 测试执行 -> 测试评估. 软件测试 & 软件开发的生命周期 1.需求阶段 测试人员了解需求, 对需求进行分解, 得出测试需求. 2.计划阶段 根据需求编写测试计划/测试方案 3…

Web核心

目录 Web核心HTTP概念&#xff1a;协议特点&#xff1a;请求数据格式响应数据格式 Tomcat简介基本使用配置部署项目IDEA中创建 Maven Web 项目 IDEA使用Tomcat Servlet简介快速入门执行流程生命周期体系结构Servlet urlPattern配置一个Servlet&#xff0c;可以配置多个 urlPatt…

java-springboot实现图片的上传

我们在resources目录下创建image目录来存放上传的图片 service层懒的写&#xff0c;就都写controller层了。 RestController RequestMapping("/upload") public class upload {PostMapping("/pic")public String upLoad(RequestParam("multipartFile…

PTA金字塔游戏

幼儿园里真热闹&#xff0c;老师带着孩子们做一个名叫金字塔的游戏&#xff0c;游戏规则如下&#xff1a; 首先&#xff0c;老师把孩子们按身高从高到矮排列&#xff0c;选出最高的做队长&#xff0c;当金字塔的塔顶&#xff0c;之后在其余小朋友里选出两个最高的&#xff0c;…

12个好玩又实用的Python迭代器和生成器实例

大家好&#xff01;今天我们要来一场编程奇趣之旅&#xff0c;一起揭秘那些既让代码变得更简洁高效&#xff0c;又能带你领略Python魅力的12个迭代器和生成器实例。别担心&#xff0c;我会用轻松易懂的语言帮你掌握这些小技巧&#xff0c;准备好你的笔记本&#xff0c;咱们这就…

MySQL 练习三

select sname,sex,class from student;select distinct depart from teacher;select * from student;select * from score where degree between 60 and 80;select * from score where degree in(85,86,88);select * from student where class’95031’ or sex’女’;select * …

transductive transfer learning

如图所示&#xff0c;传统的机器学习方法尝试去学习每一种任务&#xff0c;而迁移学习则根据已经学习处理过的任务推广到有较少训练数据的新任务上。在传统的机器学习中&#xff0c; transductive learning指所有测试数据在训练时被要求看到的情况&#xff0c;并且对于新的数据…

谈谈计算机科学与技术这门专业

原文地址&#xff1a;谈谈计算机科学与技术这门专业 - Pleasure的博客 下面是正文内容&#xff1a; 前言 这是一篇个人性质的笔记。 专业代码080901 或许也可以理解为计算机科学与技术专业大致都要经历的学习路线&#xff08;主要还是根据本校&#xff09;。 正文 主要专业课程…

Redis中的事件(二)

文件事件 文件事件的处理器 Redis为文件事件编写了多个处理器&#xff0c;这些事件处理器分别用于实现不同的网络通信需求&#xff0c;比如说: 1.为了对连接服务器的各个客户端进行应答&#xff0c;服务器要为监听套接字关联连接应答处理器2.为了接收客户端传来的命令请求&a…

数据结构与算法分析引论1

1.解决问题的算法有很多&#xff0c;但是在输入不同的情况下&#xff0c;不同算法之间的差异也很大&#xff0c;我们总是追求一个更快、更有效的方法。比如说普通的依次查找和二分查找&#xff0c;两者的差异就很大。我们使用大O表示法来表示算法的速度。依次查找就是O(n)&…

Fiddler抓包工具之Fiddler界面主菜单功能介绍

Fiddler界面主菜单功能介绍 File菜单 File菜单中的命令主要支持完成通过Fiddler来启动和停止web流量的捕获&#xff08;capture&#xff09;,也可以加载或存储捕获的流量 &#xff08;1&#xff09;Capture Traffic&#xff1a;默认勾选&#xff0c;勾选此项才可抓包&#xff…

USB HOST移植

一、USB简介 USB有USB1.0/1.1/2.0/3.0多个版本&#xff0c;标准USB由4根线组成,VCC&#xff0c;GND&#xff0c;D&#xff0c;D-&#xff0c;其中D和D-是数据线&#xff0c;采用差分传输。 在USB主机上,D-和D都是接了15K的电阻到地,所以在没有设备接入的时候,D、D-均是低电平。…

Scala环境搭建

目录 前言 Scala的概述 Scala环境的搭建 一、配置Windows的JAVA环境 二、配置Windows的Scala环境 编写一个Scala程序 前言 学习Scala最好先掌握Java基础及高级部分知识&#xff0c;文章正文中会提到Scala与Java的联系&#xff0c;简单来讲Scala好比是Java的加强版&#x…

【Java多线程(2)】Thread常见方法和线程状态

目录 一、Thread类及常见方法 1. join() 等待一个线程 2. currentThread() 获取当前线程引用 3. sleep() 休眠当前线程 二、线程的状态 1. 线程的所有状态 2. 状态转移 一、Thread类及常见方法 接上文&#xff1a;多线程&#xff08;1&#xff09;http://t.csdnimg.cn/…

git-怎样把连续的多个commit合并成一个?

Git怎样把连续的多个commit合并成一个&#xff1f; Git怎样把连续的多个commit合并成一个&#xff1f; 参考URL: https://www.jianshu.com/p/5b4054b5b29e 查看git日志 git log --graph比如下图的commit 历史&#xff0c;想要把bai “Second change” 和 “Third change” 这…

cinder学习小结

1 官方文档 翻译官方文档学习 链接Cinder Administration — cinder 22.1.0.dev97 documentation (openstack.org) 1.1 镜像压缩加速 在cinder.conf配allow_compression_on_image_upload True可打开开关 compression_format xxx可设置镜像压缩格式&#xff0c;可为gzip 1.2 …

手撕算法-数组中的第K个最大元素

描述 分析 使用小根堆&#xff0c;堆元素控制在k个&#xff0c;遍历数组构建堆&#xff0c;最后堆顶就是第K个最大的元素。 代码 class Solution {public int findKthLargest(int[] nums, int k) {// 小根堆PriorityQueue<Integer> queue new PriorityQueue<>…