数据结构排序——快排的递归与非递归

news2025/1/1 22:03:05

1.霍尔排序(递归方法) 

这个是将右边找到比key小的数字,之后让左边找到比key大的数字,让左右的交换,如果相遇就会停止,让key与他们停止的位置进行交换,这时,交换的位置一定比key小,完成这一次之后,key左边都是比他小的,右边都是比他大的。(这只是第一遍)

void kuaipai1(int* a, int left, int right)
{
	if (left >= right)
		return;
	int keyi = left;
	int begin = left;
	int end = right;
	while (begin < end)
	{
		while (begin < end && a[begin] < a[keyi])
		{
			begin++;
		}
		while (begin<end && a[end]>a[keyi])
		{
			end--;
		}
		int tem = a[end];
		a[end] = a[begin];
		a[begin] = tem;
	}
	int tem = a[keyi];
	a[keyi] = a[end];
	a[end] = tem;
	keyi = begin;
	kuaipai1(a, left, keyi - 1);
	kuaipai1(a, keyi + 1, right);
}

我们排完第一遍的时候,key的位置是已经确定的了,所以将左边与右边再次带入函数中,进行递归,直到left与right相同或大于。这就像二叉树一样,根,左子树,右子树。 

while循环的条件begin<end是因为防止他寻找小的数字时,越过了left,造成错误。 

这里我只是演示了key左边的快排,这里我们可以看见结束快排的right=left的情况。

(这里我们也可以让右边为key,但是你要让左边先动,让左边找到大的与右边交换,最后让left与key交换) 

2.双指针 (递归方法)

void kuaipai2(int* a, int left, int right)
{
	if (left >= right)
		return;
	int cur, prev;
	int keyi = left;
	cur = keyi;
	prev = keyi + 1;
	while (prev <= right)
	{
		if (a[prev] < a[keyi] && ++cur != prev)
		{
			int tem = a[prev];
			a[prev] = a[cur];
			a[cur] = tem;
		}
		prev++;
	}
	int tem = a[keyi];
	a[keyi] = a[cur];
	a[cur] = tem;
	keyi = cur;
	kuaipai2(a, left, keyi - 1);
	kuaipai2(a, keyi + 1, right);
}

这里当prev小于keyi的时候,就会让cur++,并且交换值,再让prev++,但是交换的时候有一个前提,就是cur++之后他不可以等于prev,当相等时不会发生交换,但是会让cur+1。完成后会再让 cur与keyi交换。在进行相同的递归。

3.非递归法(要用到栈的知识) 

void kuaipai3(int* a, int left, int right)
{
	ST ps;
	Init(&ps);
	Push(&ps, right);
	Push(&ps, left);
	while (ps.top>0)
	{
		int begin = Top(&ps);
		Pop(&ps);
		int end = Top(&ps);
		Pop(&ps);
		int keyi=fuzhu(a,begin,end);
		if (keyi < end)
		{
			Push(&ps, end);
			Push(&ps, keyi + 1);
		}
		if (begin < keyi)
		{
			Push(&ps, keyi - 1);
			Push(&ps, begin);
		}
	}
	Destory(&ps);
}
int fuzhu(int* a, int left, int right)
{
	int cur, prev;
	int keyi = left;
	cur = keyi;
	prev = keyi + 1;
	while (prev <= right)
	{
		if (a[prev] < a[keyi] && ++cur != prev)
		{
			int tem = a[prev];
			a[prev] = a[cur];
			a[cur] = tem;
		}
		prev++;
	}
	int tem = a[keyi];
	a[keyi] = a[cur];
	a[cur] = tem;
	keyi = cur;
	return keyi;
}

 

这里的Push是将你指定的数字输入到栈中,Top的意思是获得栈顶的数据,Pop的意思是去掉栈顶的数据,Destory是销毁栈。

这里我先将你要排序的最左边与最右边的下标传到栈中,再用begin为左边的下标,end为右边的下标 ,用fuzhu函数进行第一次排序,并返还keyi的位置,然后在进行类似左子树的区间与右子树的区间,就像霍尔方法的一样,将key的左边,右边的范围输入到栈中,最后再取左边的区间,再进行排序,但是这时会不停的对左边进行排序,直到左边排序完成,再进行右边的排序。(因为是先输入右边,再输入左边,根据栈的规则先进后出,所以会一直取左边的区间)

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

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

相关文章

【Git 学习笔记_24】Git 使用冷门操作技巧(四)——更多实用 git 别名设置、交互式新增提交

文章目录 11.8 更多别名设置别名1&#xff1a;只查看当前分支&#xff08;git b&#xff09;别名2&#xff1a;以图表形式显示自定义格式的 git 日志&#xff08;git graph&#xff09;别名3&#xff1a;查看由于合并分支导致的冲突后仍有冲突的、待合并的文件列表&#xff08;…

node快速复制文件或文件夹,排除部分文件(node_modules)

const fs require(fs) const path require(path)/*** description: 获取完整的文件路径* param {*} url 路径* return {*} 返回完整的文件路径*/ const getPath (url) > {return path.join(__dirname, url) }/*** description: 获取参数* return {*} target【目标文件夹】…

Redis应用之Feed流关注推送

我的博客大纲 我的后端学习大纲 -------------------------------------------------------------------------------------------------------------------------------------------------# 3.好友关注&#xff1a; 3.1.关注和取关&#xff1a; a.接口说明&#xff1a; b.编…

算法【Java】 —— 前缀和

模板引入 一维前缀和 https://www.nowcoder.com/share/jump/9257752291725692504394 解法一&#xff1a;暴力枚举 在每次提供 l 与 r 的时候&#xff0c;都从 l 开始遍历数组&#xff0c;直到遇到 r 停止&#xff0c;这个方法的时间复杂度为 O(N * q) 解法二&#xff1a;前…

不会Excel怎么制作桑基图?用什么软件绘制比较好呢?推荐2款简单好用的图表制作工具

桑基图制作很简单&#xff0c;不需要任何基础一次就会&#xff01; 2个桑基图制作工具&#xff0c;帮你一键解决问题~ 1、Dycharts 推荐指数&#xff1a;☆☆☆☆☆ 点击链接直达>>dycharts.com Dycharts是国内一款专业的在线图表制作工具&#xff0c;0代码、无门槛&…

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(2) &#xff08;*****生成数据结构类的方式特别有趣****&a…

AI基础 L5 Uninformed Search II 无信息搜索

How good is search? • Completeness: Does it always find a solution if one exists? 是否通解 • Optimality: Is the solution optimal (i.e., lowest cost)? 是否最优 • Time Complexity: How long does it take to find a solution? 时间多久 • Space Complexit…

程序员都在使用的画图工具

大家好&#xff0c;我是袁庭新。 程序员都在使用的画图工具&#xff0c;你一定没用过这款画图工具吧&#xff01;我教程中的架构图都是用它来画的。 比如我编写的RDB工作原理图就是用draw.io绘制的&#xff0c;如下图所示&#xff1a; 再例如Redis集群故障恢复原理图我也是通…

【论文阅读】DETRs Beat YOLOs on Real-time Object Detection

文章目录 摘要一、介绍二、相关工作2.1 实时目标检测器2.2 端到端目标检测器 三、检测器的端到端速度3.1 分析 NMS3.2 端到端速度基准 四、实时 DETR4.1 模型概述4.2 高效混合编码器4.3不确定性最小的查询选择4.4 缩放的RT - DETR 五、实验5.1 与SOTA对比5.2 混合编码器的消融研…

VMware Fusion Pro 13 for Mac虚拟机软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件 地址&#xff1a;www.macfxb.cn 二、开始安装 安装完成&#xff01;&#xff01;&#xff01;

F12抓包06-4:导出metersphere脚本

metersphere是一站式的开源持续测试平台&#xff0c;我们可以将浏览器请求导出为HAR文件&#xff0c;导入到metersphere&#xff0c;生成接口测试。 metersphere有2种导入入口&#xff08;方式&#xff09;&#xff0c;导入结果不同&#xff1a; 1.导入到“接口定义”&#xf…

ctfshow-web入门-sql注入(web237-web240)insert 注入

目录 1、web237 2、web238 3、web239 4、web240 1、web237 查询语句&#xff1a; //插入数据$sql "insert into ctfshow_user(username,pass) value({$username},{$password});"; 我们需要闭合单引号和括号 添加&#xff0c;查数据库名&#xff0c;payload&…

想要从OPPO手机恢复数据?免费OPPO照片视频恢复软件

此实用程序可帮助那些寻找以下内容的用户&#xff1a; 在OPPO手机中格式化存储卡后可以恢复图片吗&#xff1f;我删除了 OPPO上的视频和图片&#xff0c;我感觉很糟糕&#xff0c;因为里面有我在拉斯维加斯拍摄的视频和照片 免费OPPO照片视频恢复软件 您能恢复OPPO上已删除的…

解锁2024年PDF转PPT新技能,TOP4神器在手,职场晋升竟然如此简单

如今职场节奏快&#xff0c;信息传递和展示方式多样。PDF 兼容性强且稳定&#xff0c;用于分享和保存文件&#xff1b;PPT 演示功能强大&#xff0c;在开会、教学和汇报中不可或缺。实际工作中常需将 PDF 转 PPT&#xff0c;以便更好地演示和编辑。市场上因此出现众多高效方便的…

使用NetBackup GUI 图形化进行oracle备份和恢复

转载 一、环境介绍&#xff1a; 这个实验都是在vmware workstation里完成的。由于NetBackup7只能装在64位的系统上&#xff0c;所以这里采用了64位的rhel5.5系统&#xff0c;以及oracle 10gr2 for linux_x64的软件包。数据库的数据文件存储在ASM中。安装rhel、oracle、netback…

Selenium 实现图片验证码识别

前言 在测试过程中&#xff0c;有的时候登录需要输入图片验证码。这时候使用Selenium进行自动化测试&#xff0c;怎么做图片验证码识别&#xff1f;本篇内容主要介绍使用Selenium、BufferedImage、Tesseract进行图片 验证码识别。 环境准备 jdk&#xff1a;1.8 tessdata&…

关于CPP——std::future异步操作

目录 一、std::future 简介 1.1 概念 1.2 应用场景 1.3 关联的方法 1.3.1 std::async 1.3.2 std::package 1.3.3 std::promise 二、future 用法 2.1 使用std::async关联异步任务 2.2 使用std::packaged_task 1. 获取任务结果的机制&#xff1a; 2. 异步任务的管理&a…

jmeter之仅一次控制器

仅一次控制器作用&#xff1a; 不管线程组设置多少次循环&#xff0c;它下面的组件都只会执行一次 Tips&#xff1a;很多情况下需要登录才能访问其他接口&#xff0c;比如&#xff1a;商品列表、添加商品到购物车、购物车列表等&#xff0c;在多场景下&#xff0c;登录只需要…

【STM32 Blue Pill编程】-ADC数据采样(轮询、中断和DMA模式)

ADC数据采样(轮询、中断和DMA模式) 文章目录 ADC数据采样(轮询、中断和DMA模式)1、硬件准备及接线2、ADC轮询模式2.1 轮询模式配置2.2 代码实现3、ADC中断模式3.1 中断模式配置3.2 代码实现4、ADC的DMA模式4.1 DMA模式配置4.2 代码实现在本文中,我们将介绍如何使用 ADC 并…

[JAVA基础知识汇总-1] 创建线程的几种方式

文章目录 1. 继承Thread类2. 实现Runnable接口3. 实现Callable接口4. 线程池 可以认为有四种方式&#xff0c;也可以认为有一种&#xff0c;因为都跟Runnable接口有关 1. 继承Thread类 代码 public class Thread1ExtendsThread extends Thread { // public Thread1(String …