力扣精选算法100道——排序数组(分治快排)

目录

🚩了解题意

🚩算法原理

🎈取随机值

🎈c++中取随机数的步骤

🚩代码实现



🚩了解题意

本题的题意很简单,就是将nums数组排成升序即可。

🚩算法原理

本题和颜色分类那个题目很相似,就是从小到大排序。只不过不同的是,这次不是取nums[i]和左右指针相比较了,本题用的是key关键字,而关键字是随机的,不是特定的哪个值。依旧利用的是三种判断思路。

  • 如果nums[i]<key,先让left++,然后与nums[i]和nums[left]交换位置,然后i++。
  • 如果nums[i]>key,先让--right,然后与nums[i]和nums[right]交换位置。(i不往后,nums[i]依旧是未知数字)
  • 如果nums[i]==key i++. 
  • 最后i和right相遇结束
        while(i<right){if(nums[i]<key)swap(nums[++left],nums[i++]);else if(nums[i]==key)i++;else swap(nums[--right],nums[i]);}

分治快排思想,每次key进行划分,<key和>key进行划分,<key再进行划分,>key也进行划分。

🎈取随机值

在快速排序算法中,为了提高算法的性能和避免出现最坏情况(即当输入数组已经有序时造成快速排序的时间复杂度退化为O(n^2)),经常会使用随机化来选择基准值。选择随机基准值可以降低出现最坏情况的概率,使得快速排序在平均情况下表现更好。

在给定区间 [left, right] 中随机选择基准值时,通过 nums[r%(right-left+1)+left] 的方式可以保证基准值在该区间内是均匀随机选择的,即基准值可以是区间内的任意一个元素,而不是固定选择区间的第一个、最后一个或中间值,从而使得算法更具随机性,降低了最坏情况发生的概率。

nums[r%(right-left+1)+left] 是一个用于在给定范围 [left, right] 内随机选择基准值的方法。让我解释一下这个表达式是如何计算的:

  1. (right - left + 1):计算给定范围内元素的数量,即区间长度。
  2. r % (right - left + 1):生成一个 [0, right - left] 之间的随机数,通过取余操作符 % 可以确保生成的随机数在这个范围内。
  3. r % (right - left + 1) + left:将上一步生成的随机数平移至 [left, right] 区间内,即加上 left 的值,从而确保基准值在给定区间内。(因为后面的分治,[right,nums.size()-1]区间中随机值需要+left,否则就不再这个区间了。

因此,表达式 nums[r%(right-left+1)+left] 可以通过这种方式在闭区间 [left, right] 内均匀随机选择一个元素作为基准值。

🎈c++中取随机数的步骤

1/设置随机种子:在程序的开头使用 srand(time(NULL)); 设定随机数种子,以确保每次运行程序时生成的随机数不同。
2/生成随机数:
使用 rand() 函数来生成一个伪随机数,比如 int randomNumber = rand();

按照逻辑依次走一遍。 

然后我们用分治

从上述的遍历后我们分成了三个部分

  • <key  [l,left]
  • =key [left+1,right-1]
  • >key [right,r]

然后我们要进行分治 

[l,left]区域继续进行一次快排操作

[right,r]区域继续进行一次快排操作

 然后继续调用这个函数<key的区域,然后调用>key的区域,每次分治后的key都是随机取的。


🚩代码实现

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)i++;else swap(nums[--right],nums[i]);}//[l,left] [left+1,right-1] [right,r]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];}
};

做好自己。

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

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

相关文章

Tiktok矩阵系统搭建的逻辑和源代码!

很多和我一样从事外贸工具开发的朋友都清楚&#xff0c;TikTok矩阵系统不仅确保了平台的高效运行&#xff0c;还为用户提供了个性化的内容推荐&#xff0c;从而大大提升了用户黏性&#xff0c;因此很多人都乐意去开发类似的工具&#xff0c;下面我们就来说说Tiktok矩阵系统搭建…

docker 基础(二)

常见命令 Docker最常见的命令就是操作镜像、容器的命令&#xff0c;详见官方文档&#xff1a;https://docs.docker.com/ 数据卷 命令说明文档地址docker volume create创建数据卷docker volume createdocker volume ls创建数据卷docker volume lsdocker volume rm查看所有数…

SCI 投稿各阶段的邮件

SCI 投稿各阶段的邮件 SCI 投稿各阶段的邮件

C#学习:初识各类应用程序

编写我们第一个程序——Hello,World! 1.编程不是“学”出来的&#xff0c;而是“练”出来的 2.在反复应用中积累&#xff0c;忽然有一天就会顿悟 3.学习原则&#xff1a; 3.1从感官到原理 3.2从使用别人的到创建自己的 3.3必需亲自动手 3.4必需学以致用&#xff0c;紧跟实际…

金融帝国实验室(CapLab)官方更新_V9.1.65版本(2024年第13次)

〖金融帝国实验室〗&#xff08;Capitalism Lab&#xff09;游戏更新记录&#xff08;2024年度&#xff09; ————————————— ◎游戏开发&#xff1a;Enlight Software Ltd.&#xff08;微启软件有限公司&#xff09; ◎官方网站&#xff1a;https://www.capitalism…

【Git教程】(七)变基与拣取 —— 变基操作的概念、适用场景及其实现方式,拣取操作的实现 ~

Git教程 变基与拣取 1️⃣ 工作原理&#xff1a;复制提交2️⃣ 避免“钻石链”3️⃣ 什么情况下会遇到冲突4️⃣ 移植分支5️⃣ 执行变基后原提交的情况6️⃣ 提交的原件与副本存在于同一版本库中所带来的问题7️⃣ 捡取&#x1f33e; 总结 通常&#xff0c; 一段提交历史中往…

Centos中安装Docker及Docker的使用

在centos7系统中安装指定版本的docker,并通过docker使用安装mysql为例,阐述docker的使用。 2.1、Docker卸载及安装yum依赖 【卸载Docker,如果安装的Docker的版本不合适】 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-…

自定义类型详解(下)

2.位段 2.1 什么是位段 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 1. 位段的成员必须是 int 、 unsigned int 或 signed int 。 2. 位段的成员名后边有一个冒号和一个数字。 比如&#xff1a; struct A {int _a:2;int _b:5;int _c:10;int _d:30; …

继续预训练对大语言模型的影响

翻译自文章&#xff1a;Investigating Continual Pretraining in Large Language Models: Insights and Implications 摘要 本文研究了大型语言模型&#xff08;LLMs&#xff09;中不断学习&#xff08;CL&#xff09;的不断发展领域&#xff0c;重点是制定有效和可持续的训练…

大屏可视化组态工具

推荐一个包含2D、3D、图表、动态交互、数据管理等一体的大屏可视化组态工具&#xff1a;乐吾乐大屏可视化。 1 简介 乐吾乐大屏可视化&#xff0c;零代码实现物联网、工业智能制造等领域的可视化大屏、触摸屏端UI以及工控可视化的解决方案。同时也是一个Web组态工具&#xff…

基于 ECharts的Python 数据可视化库,它允许用户使用 Python 语言生成各种类型的交互式图表和数据可视化

pyecharts 是一个基于 ECharts 的 Python 数据可视化库&#xff0c;它允许用户使用 Python 语言生成各种类型的交互式图表和数据可视化。 ECharts 是由百度开发的一款强大的开源数据可视化库&#xff0c;而 Pyecharts 则是 ECharts 的 Python 封装&#xff0c;使得在 Python 中…

javaweb学习(day04-XML)

一、介绍 1 官方文档 地址: https://www.w3school.com.cn/xml/index.asp 2 为什么需要 XML 需求 1 : 两个程序间进行数据通信需求 2 : 给一台服务器&#xff0c;做一个配置文件&#xff0c;当服务器程序启动时&#xff0c;去读取它应当监听的端口号、还有连接数据库的用户名…