快速排序(递归和非递归两种方法实现)
快速排序:
1.首先找一个基准点(一般选取最左边第一个)
2.先从后往前遍历,找到第一个小于基准值的元素;
3.再从前往后,找到第一个大于基准值的元素;
4.将这两个元素两两交换
5.当i与j相遇时,说明找到了排序后当前这个基准值的正确位置,将基准点进行归位;
6.开始新的一轮,以上一轮的基准点为中轴,分成左边区域和右边区域,分别选取一个新的基准点对新的基准点进行归位即可。
非递归(利用队列实现)
//进行分区,也就是找到基准点排序后的正确位置
int pation(vector<int>& nums, int left, int right)
{int tmp = nums[left];//先将基准点保存起来//循环结束条件:i和j相遇while (left < right){//从后往前找,找到第一个小于基准点的下标while (left<right && nums[right]>tmp)--right;//将当前这个值赋给左下标的元素if (left < right) nums[left] = nums[right];//从前往后,找到第一个大于基准值的下标while (left < right && nums[left] <= tmp)++left;将当前这个值赋给右下标的元素if (left < right) nums[right] = nums[left];}//此时left和right就是基准值的正确位置//将基准值归位nums[left] = tmp;return left;
}
//非递归
void quickSort(vector<int>& nums, int left, int right)
{queue<int> qu;//通过队列实现非递归,如果用栈就是先放右边的值再放左边的值qu.push(left);qu.push(right);while(!qu.empty()){left = qu.front(); qu.pop();right = qu.front(); qu.pop();//分区int pos = pation(nums, left, right);//对左边序列进行排序if (left < pos - 1){qu.push(left);qu.push(pos - 1);}//对右边序列进行排序if (right > pos + 1){qu.push(pos + 1);qu.push(right);}}
}
int main()
{cout << "请输入数组大小:" << endl;int n;cin >> n;vector<int> nums(n);for (int i = 0; i < n; i++){cin >> nums[i];}quickSort(nums, 0, n - 1);cout << "排序后的数组:" << endl;for (auto& i:nums){cout << i << " ";}cout << endl;return 0;
}
递归:
void dfs(vector<int>& nums, int left, int right)
{//左右边界相遇时,直接return结束if (left >= right) return;int key = nums[left];//保存基准值int i = left, j = right;while (i < j){//从后往前找第一个小于基准值的元素while (nums[j]>=nums[left] &&i<j){j--;}//从前往后找第一个大于基准值的元素while (nums[i] <= nums[left] && i<j){i++;}//左右边界没有相遇,将这两个值两两交换if (i < j){swap(nums[j], nums[i]);}}//此时循环结束,i或j下标就代表基准值的正确下标位置nums[left] = nums[i];nums[i] = key;//递归左边区域dfs(nums, left, i - 1);//递归右边区域dfs(nums, i + 1, right);
}
注意:
快速排序的时间复杂度通常情况下是O(nlogn)
但在特殊情况下,比如选取的这个基准点刚好是最大值或是最小值时,对n个元素排序,需要遍历n次,此时时间复杂度为O(n*n);
相关文章:
快速排序(递归和非递归两种方法实现)
快速排序: 1.首先找一个基准点(一般选取最左边第一个) 2.先从后往前遍历,找到第一个小于基准值的元素; 3.再从前往后,找到第一个大于基准值的元素; 4.将这两个元素两两交换 5.当i与j相遇时…...
ApiPost7使用介绍 | HTTP Websocket
一、基本介绍 创建项目(团队下面可以创建多个项目节点,每个项目可以创建多个接口): 参数描述库(填写参数时自动填充描述): 新建环境(前置URL、环境变量很有用)&#x…...
Linux常用命令——convertquota命令
在线Linux命令查询工具 convertquota 把老的配额文件转换为新的格式 补充说明 convertquota命令用于将老的磁盘额数据文件(“quota.user”和“quota.group”)转换为新格式的文件(“quota.user”和“quota.group”)。 语法 c…...
Linux 进程基础概念-进程状态、进程构成、进程控制
目录 Linux 进程 进程基础概念 进程状态 进程的构成 进程控制 进程创建和终止 Linux 进程 参考: 「linux操作系统」进程的切换与控制到底有啥关系? - 知乎 (zhihu.com),Linux进程解析_deep_explore的博客-CSDN博客,腾讯面试…...
Unity Animation、Animator 的使用
文章目录 1. 添加动画2. Animation2.1 制作界面2.2 制作好的 Animation 动画2.3 添加和使用事件 3. Animator3.1 制作界面3.2 一些参数解释3.3 动画参数 4. Animator中相关类、属性、API4.1 类4.2 属性4.3 API4.4 几个关键方法 5. 动画播放和暂停控制 1. 添加动画 选中待提添加…...
Flink--2、Flink部署(Yarn集群搭建下的会话模式部署、单作业模式部署、应用模式部署)
星光下的赶路人star的个人主页 你必须赢过,才可以说不在乎输赢 文章目录 1、Flink部署1.1 集群角色1.2 Flink集群搭建1.2.1 集群启动1.2.2 向集群提交作业 1.3 部署模式1.3.1 会话模式(Session Mode)1.3.2 单作业模式(Per-Job Mod…...
执行Django 的迁移命令报错[1193, Unknown system variable default_storage_engine]
在学习“”编写你的第一个 Django 应用程序,第2部分”时候,遇到一个问题。 执行迁移命令 python manage.py makemigrations polls 后,报错: migrations.py:109: RuntimeWarning: Got an error checking a consistent migration …...
Himall商城-公共方法
目录 1 Himall商城-公共方法 1.1 /// 根据订单id获取订单项 1.2 /// 根据订单项id获取售后记录 1.3 /// 判断订单是否正在申请售后 Himall商城-公共方法 #region 公共方法 public static List<InvoiceTitleInfo> GetInvoiceTitles(long userid) {...
海域可视化监管:浅析海域动态远程视频智能监管平台的构建方案
一、方案背景 随着科技的不断进步,智慧海域管理平台已经成为海洋领域监管的一种重要工具。相比传统的视频监控方式,智慧海域管理平台通过建设近岸海域视频监控网、海洋环境监测网和海上目标探测网络等,可实现海洋管理的数字化转型。 传统的…...
使用Spring Boot + MyBatis实现多数据源
一、引言 在开发中,我们经常会遇到需要连接多个数据库的情况。使用Spring Boot和MyBatis框架可以很方便地实现多数据源的配置和使用。本文将详细介绍如何在Spring Boot项目中使用多数据源。 二、实操 1、添加所需的依赖: <!-- Spring Boot Starte…...
C++中的无限循环
C中的无限循环 while、 do…while 和 for 循环都包含一个条件表达式,在它为 false 时循环结束。如果您指定的条件总是为 true,循环就不会结束。 无限 while 循环类似于下面这样: while(true) // while expression fixed to true {DoSomethi…...
Spark2x原理剖析(二)
一、概述 基于社区已有的JDBCServer基础上,采用多主实例模式实现了其高可用性方案。集群中支持同时共存多个JDBCServer服务,通过客户端可以随机连接其中的任意一个服务进行业务操作。即使集群中一个或多个JDBCServer服务停止工作,也不影响用…...
tomcat安装、部署JSPGOU项目、Tomcat多实例
安装 官网找包 Apache Tomcat - Welcome! tomcat 8 准备运行环境 安装tomcat catalina.sh 服务脚本管理文件 server.xml 主配置文件 修改8009(删除注释) 启动tomcat 访问 为了避免每次进入绝对路径启动tomcat 法二: 三:部署…...
257. 二叉树的所有路径
题目链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 我的想法: 层次遍历不好解,可用找到叶子节点,但是他有一个回溯过程,他要一直保留路径节点,层次迭代不好加回溯。 递归…...
windows10使用wheel安装tensorflow2.13.0/2.10.0
安装过程 安装虚拟环境安装virtualenv安装满足要求的python版本使用virtualenv创建指定python版本的虚拟环境 安装tensorflow安装tensorflow-docs直接下载使用wheel下载 在VSCode编辑器中使用虚拟环境下的包 注意: tensorflow 2.10.0是最后一个支持GPU的版本 安装虚…...
sql-gen:点击生成SQL、RO、VO的工具
sql-gen仓库地址:码云 Github 1. 概述 sql-gen是一个用于提高后端接口开发效率的小工具,主要有如下功能: 生成连表SQL语句根据WHERE条件来生成封装查询条件的实体类(RO)根据SELECT列来生成封装查询结果的实体类&…...
pytorch从0开始安装
文章目录 一. 安装anaconda1.安装pytorch前需要先安装anaonda,首先进入官网(Anaconda | The Worlds Most Popular Data Science Platform)进行安装相应的版本。2.接着按如图所示安装,遇到下面这个选项时,选择all users.3.选择自己…...
Java 语言实现最小生成树算法(如Prim算法、Kruskal算法)
引言: 在图论中,最小生成树是指一个无向图的生成树,其所有边的权值之和最小。解决最小生成树问题的两种主要算法是Prim算法和Kruskal算法。本文将深入探讨这两种算法并比较它们的优缺点,以帮助读者更好地理解最小生成树算法的原理…...
什么是Linux的Overcommit和OOM
overcommit_memory参数说明: 设置内存分配策略(可选,根据服务器的实际情况进行设置) /proc/sys/vm/overcommit_memory 可选值:0、1、2。 0, 表示内核将检查是否有足够的可用内存供应用进程使用…...
解决防火墙导致虚拟机不能ping通宿主机的问题
今天,无缘无故的,虚拟机突然用不了,网络连上不了,一番折腾翻找,最后才发现,是因为虚拟机ping不同宿主主机了,连网关都ping不通了,但是,宿主主机却可以ping通虚拟机 。 最…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
MLP实战二:MLP 实现图像数字多分类
任务 实战(二):MLP 实现图像多分类 基于 mnist 数据集,建立 mlp 模型,实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入,可视化图形数字; 2、完成数据预处理:图像数据维度转换与…...
