【非递归】手搓快速排序

news2025/1/21 18:54:33

欢迎来到 Claffic 的博客 💞💞💞

前言: 

快速排序已经带大家实现过了,我们用到的方法是递归法,你知道吗,用循环也可以实现快速排序,来看看吧。

注:

这篇博客属于数据结构内容,建议学习完C语言的小伙伴食用~


目录

🐯1.快排回顾

🦁2.非递归思想

🐮3.实现


1.快排回顾

还记得递归版的快速排序是怎么实现的吗? 

默认使用前后指针法:
 

代码实现:

//快排(前后指针法)
void QuickSort3(int* a, int left, int right)
{
	if (left >= right)
		return;

	//三数取中
	int midi = GetMidi(a, left, right);
	if (midi != left)
	    Swap(&a[midi], &a[left]);

	int keyi = left;
	int key = a[left];
	int prev = left;
	int cur = left + 1;

	while (cur <= right)
	{
		if (a[cur] < key && ++prev != cur)
			Swap(&a[cur], &a[prev]);
		cur++;
	}
	Swap(&a[keyi], &a[prev]);//与下标为keyi的交换
	keyi = prev;

	//递归
	QuickSort3(a, left, keyi - 1);
	QuickSort3(a, keyi + 1, right);
}

在代码末尾进行了递归操作,那么非递归如何实现呢? 

2.非递归思想

要想用非递归实现排序,我们首先要观察递归是如何实现的: 

不变的是一趟中数字的交换逻辑,

变化的是需要进行 调整的区间

我们从变化的入手:

可以看到,调整的区间在变化(紫色标号);

也就是说,我们可以在循环中 存储要调整的区间 ,用到时再取出来;

这个有先入后出的特点,可以选择栈来实现。

那么如何模拟返回条件呢?

递归版是一个数字的时候就返回,那么非递归版就可以是子区间有一个值或者没有值就不把区间入栈。

思路总结:

里面取一段区间,单趟排序;

• 单趟分割子区间入栈;

• 子区间只有一个值或者不存在就不入栈

3.实现

void QuickSortNotR(int* a, int left, int right)
{
	Stack ST;
	StackInit(&ST);
	StackPush(&ST, right); // 先入右,再入左,才能先出左,再出右。
	StackPush(&ST, left);

	while (!StackEmpty(&ST))
	{
        // 取出区间
		int begin = StackTop(&ST);
		StackPop(&ST);
		int end = StackTop(&ST);
		StackPop(&ST);

        // PartSort3返回是快速排序的keyi值
		int keyi = PartSort3(a, begin, end);
		//[begin,keyi-1] keyi [keyi+1,end]
        //满足非一零就出栈
		if (keyi + 1 < end)
		{
			StackPush(&ST, end);
			StackPush(&ST, keyi + 1);
		}
		if (begin < keyi - 1)
		{
			StackPush(&ST, keyi - 1);
			StackPush(&ST, begin);
		}
	}

	StackDestroy(&ST);
}

代码已上传至 我的gitee 

拿走不谢~


总结: 

这篇博客内容比较简单,就是仿照递归版本实现了非递归的快速排序。

码文不易 

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗

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

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

相关文章

FE_CSS 基础选择器 字体属性 文本属性 综合案例

1 CSS 基础选择器 选择器分为基础选择器和复合选择器两个大类&#xff0c;基础选择器是由单个选择器组成的&#xff0c;基础选择器又包括&#xff1a;标签选择器、类选择器、id 选择器和通配符选择器。 1.1 标签选择器 标签名{属性1: 属性值1; 属性2: 属性值2; 属性3: 属性…

从0-1搭建交付型项目管理体系流程-- 项目启动篇【宝芝林5】

一. 目标及作用 本阶段主要的目标是签订合同及SOW工作说明书&#xff0c;其里程碑事件为甲乙双方完成合同及SOW工作说明书签字及盖章&#xff0c;以及召开项目启动会。 主要作用是明确项目甲乙双方的权利和义务&#xff0c;以及与甲方及其他实施团队共同制定项目章程&#xf…

有趣的Hack-A-Sat黑掉卫星挑战赛——被破坏的阿波罗计算机(解法一)

国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加&#xff0c;太空已经成为国家赖以生存与发展的命脉之一&#xff0c;凝聚着巨大的国家利益&#xff0c;太空安全的重要性日益凸显[1]。而在信息化时代&#xff0c;太空安…

面试官:你做过什么有亮点的项目吗?

前言 面试中除了问常见的算法网络基础&#xff0c;和一些八股文手写体之外&#xff0c;经常出现的一个问题就是&#xff0c;你做过什么项目吗&#xff1f; 面试官其实是想看看你做过什么有亮点的项目, 其实大家日常做的项目都差不多&#xff0c;增删改查&#xff0c;登录注册&…

如何压缩照片到30kb以下?三个方法

如何压缩照片到30kb以下&#xff1f;随着网络的发展&#xff0c;我们经常要上传一些照片到网上&#xff0c;如公务员考试&#xff0c;教师招聘等&#xff0c;而且要求上传的照片大小不超过30kb&#xff0c;我们如何把照片压缩到30kb以下呢&#xff1f;现在很多平台上传图片时都…

【Arduino机器人手臂和麦克纳姆轮平台自动操作】

【Arduino机器人手臂和麦克纳姆轮平台自动操作】 1. 概述2. 构建 Arduino 机器人3. Arduino机器人电路图4. Arduino Code在本教程中,我将向您展示我如何从我以前的视频中制作我的 Mecanum Wheels 机器人平台,以便与我的 3D 打印机械臂协同工作并自动操作,这也是我之前视频之…

Redis高可用高性能缓存的应用系列03 - 缓存过期淘汰策略LRU、LFU

概述 Redis高可用高性能缓存的应用系列的第3篇&#xff0c;主要介绍Redis缓存过期淘汰策略和内存淘汰策略回收的LRU和LFU的知识点进行说明。 Redis过期键删除策略 Redis设置key时&#xff0c;都会设置一个过期时间&#xff0c;那么当过期时间到了都是怎么处理的&#xff1f;…

C++ 缺省参数 函数重载 引用

缺省参数&#xff0c;我们先看一下什么是缺省参数 首先&#xff0c;这个是我们的需要传参的函数&#xff0c;这里我们传入 1 然后就输出 a 下面我们就看一下缺省参数 我们现在看main函数里面调用fun函数&#xff0c;这里会输出多少呢&#xff1f; OK 这里我们分别输出了0 和 1…

在线文章生成器-文章生成器在线生成

免费自动写作软件 目前市面上存在一些免费自动写作软件&#xff0c;以下介绍几个开源的自动写作软件。 GPT-2&#xff1a;这是由OpenAI推出的一款自动写作工具&#xff0c;它可以生成高质量的文章&#xff0c;其优点在于能够理解语言结构和语法规则&#xff0c;从而生成表达自…

如何建立含有逻辑删除字段的唯一索引

文章目录业务场景分析解决总结业务场景 在实际工作当中&#xff0c;遇到一个场景&#xff0c;就是在用户注册时&#xff0c;名字要全局唯一&#xff0c;当然&#xff0c;我们是可以对用户进行删除的&#xff0c;你会怎么去做&#xff1f; 分析 一般来说&#xff0c;我们可以…

Java语法理论和面经杂疑篇《八. File类和IO流》

目录 1. java.io.File类的使用 1.1 概述 1.2 构造器 1.3 常用方法 1、获取文件和目录基本信息 2 列出目录的下一级 3 File类的重命名功能 4 判断功能的方法 5 创建、删除功能 1.4 练习 2. IO流原理及流的分类 ​编辑 2.1 Java IO原理 2.2 流的分类 2.3 流的API …

5.基于多能互补的热电联供型微网优化运行

说明书 代码相关资源&#xff1a;风、光、负荷场景生成&#xff1b;风电出力各场景及概率&#xff1b;光伏出力各场景及概率&#xff1b;负荷各场景及概率&#xff1b;场景的削减&#xff1b;样本概率初始化&#xff1b;样本削减 风电场风速两参数weibull(威布尔)分布的MATLA…

干翻Hadoop系列之:Hadoop前瞻之分布式知识

前言 一&#xff1a;海量数据价值 二&#xff1a;海量数据两个棘手问题 1&#xff1a;海量数据如何存储&#xff1f; 掌握分布式存储数据的思想。 A&#xff1a;方案1&#xff1a;单机存储磁盘不够加磁盘 限制问题&#xff1a; 1&#xff1a;一台计算机不能无限制拓充 2&a…

tomcat安装与配置

目录 1、安装jdk(官方站点下载 jdk-8u60-linux-x64.tar.gz ) 2、安装tomcat&#xff08;官方站点下载apache-tomcat-8.5.20.tar.gz&#xff09; 3、在浏览器上输入http://192.168.88.144:8080 4、写一个启动关闭的服务脚本 5、布置jpress应用 6、浏览器地址栏输入http://192…

真正的ChatGPT平替产品:Claude

01 Claude ChatGPT已经流行了很长的时间了&#xff0c;但是ChatGPT 由于种种的限制&#xff0c;我们无法用上&#xff0c;也有很多的平替产品&#xff0c;但是这些平替产品也有很多的问题。 现在 Claude 出来了&#xff0c;没有任何的限制。 Claude 不用魔法&#xff0c;注…

go test main包报错

前言 先提出问题, 再说明原因. 有如下一段代码: 当执行go test测试时, 会报如下错误: main.test /var/folders/55/47pl3jxx6rg7m0r6xvn4f7wr0000gn/T/go-build2769402238/b001/_testmain.go:13:8: could not import main (cannot import “main”) FAIL main [build failed] 什…

Linux文件类型详解

在Linux中一切都是文件&#xff0c;但文件都得有类型。那如何查看文件是什么类型了&#xff1f;在Linux中可以使用以下命令 ls -l path在显示文件的属性通常会以如下形式进行显示&#xff1a; drwxr-xr-x第1个字母&#xff1a;代表文件类型 第2~4字母&#xff1a;代表用户的权…

Dell戴尔笔记本电脑G5 SE 5505原装出厂Windows10系统恢复原厂oem系统1909

Dell戴尔笔记本电脑G5 SE 5505原装出厂Windows10系统恢复原厂oem系统1909 链接&#xff1a;https://pan.baidu.com/s/1imNdbSvxEqbMI3ODo-K3qQ?pwdhdez 提取码&#xff1a;hdez

Kubernetes安全加固

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/130034953 一、认证安全配置 1.1、X.509客户端证书 X.509客户端证书是目前用户最常用的认证安全配置方式&#xff0c;其也可称作HTTPS证书认证&#xff0c;是基于CA根证书签名的双向数字证书认证方式…

论文精读1:(网格特征)In Defense of Grid Features for Visual Question Answering(CVPR2020)

马萨诸塞州立大学阿默斯特分校Facebook 人工智能研究 目录1. Introduction2. Related WorkVisual features for vision and language tasksPre-training for VQARegions vs. grids.3. From Regions to Grids3.1. Bottom-Up Attention with RegionsRegion selectionRegion featu…