快速排序的非递归实现

上期我们实现了快速排序的递归实现,但是我们知道如果递归深度太深,栈就会溢出,所以我们本期将为大家讲述快速排序的非递归实现,我们需要用到栈的数据结构,我们知道栈中的数据全是在堆区开辟的空间,堆的空间大小是比栈的大小要大的,这便是我们为什么要采用非递归的方法实现快排的原因。

快速排序非递归实现

        在学习非递归之前,我们先回顾一下,使用递归方法实现排序的方法,我们依旧采用第一种单趟排序的方法。这种方法单趟排序的目的就是最终找一个key,如果是排升序,最终k位置左边的所有元素都比key位置上的元素小,右边的所有元素都比key位置上的元素大。也就意味着,最终找到了一个key位置,这个位置上的元素已经排好了序。

        当我们进行完单趟排序之后,找到了一个key值,因为这个位置的元素已经排好了序,所以我们只需要对这个key位置左边和右边的所有元素进行快速排序即可,这就是我们实现快速排序的递归方法。单趟排序一次只能排好一个元素

那么如何进行非递归呢?

         非递归的实现其实是在递归的方法上进行改进的,就是将递归中的操作改成用循环来实现。因为单趟排序一次可以排好一个元素,那么n个元素总共就需要n-1次单趟排序,然后我们就可以利用循环来进行所有的单趟排序,每一次单趟排序都会返回一个key,我们要根据key的位置确定下一次单趟排序的元素的下标范围。假如我们现在已经确定了一个key,那么此时我们要么开始对右边进行单趟排序,要么对左边的元素进行单趟排序,但是一旦我们选择了左边,那么就必须将左边的所有元素排好序之后才能去排右边的元素,所以我们如果先排了左边,那么就需要将右边的元素的下标范围存储起来,以便于最后将左边元素排好之后返回来进行右边的排序。怎么样保存,这便就用到了栈的数据结构。如果先对左边的所有元素进行单趟排序,后对右边的所有元素进行单趟排序,根据栈先进后出的性质,那么就得先将右边元素的下标入栈,再将左边的元素的下标入栈。因为当数组中只有一个元素时是没有必要进行单趟排序的,所以要进行单趟排序必须保证数组中至少有两个元素,这就是我们是否继续进行单趟排序的条件。

以上便是非递归的思路,总的来说,有些复杂,大家仔细阅读几遍。

 图示如下: 

161e867058fc4f1d9c73cc8c3f337869.png

非递归整体代码如下:

void QuickSortNR(int* a, int left, int right)
{ST Stack;StackInit(&Stack);StackPush(&Stack, right);StackPush(&Stack, left);while (!StackEmpty(&Stack)){int begin = StackTop(&Stack);StackPop(&Stack);int end = StackTop(&Stack);StackPop(&Stack);int key = PartSort1(a, begin, end);if (begin < key - 1){StackPush(&Stack, key - 1);StackPush(&Stack, begin);}if (key + 1 < end){StackPush(&Stack, end);StackPush(&Stack, key + 1);}}StackDestroy(&Stack);
}

注意:我们使用非递归实现快速排序时,最重要的还是要保证栈中元素的变化,只有当栈中存在元素时我们才进行循环,栈中存放的就是我们每次进行单趟排序的区间。 

到此,快速排序的所有知识点我们已经学习完,总而言之,在我们多次的优化下,快速排序已经是一个非常优秀的排序了。

本期内容到此结束^_^ 

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

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

相关文章

VS2015编译GDAL3.2.0+opencl+C#

参考借鉴https://www.cnblogs.com/litou/p/15004877.html 参考借鉴https://www.cnblogs.com/xiaowangba/p/6313903.html 参考借鉴gdal、proj、geos、sqlite等在VS2015下编译和配置_vs2015编译sqlite3-CSDN博客 参考借鉴Windows下GDAL3.1.2编译 (VS2015)_gdal windows编译-CS…

【动手学深度学习】(十)PyTorch 神经网络基础+GPU

文章目录 一、层和块1.自定义块2.顺序块3.在前向传播函数中执行代码 二、参数管理1.参数访问2.参数初始化3.参数绑定 三、自定义层1.不带参数的层2.带参数的层 四、读写文件1.加载和保存张量2.加载和保存模型参数五、使用GPU [相关总结]state_dict() 一、层和块 为了实现复杂神…

机器学习---线性回归案例

1、梯度下降法调节参数 2、模拟过拟合 训练模型都会将数据集分为两部分&#xff0c;一般会将0.8比例的数据集作为训练集&#xff0c;将0.2比例的数据集作为测试集&#xff0c;来训练模型。模型过拟合就是训练出来的模型在训练集上表现很好&#xff0c;但是在测试集上表现较差的…

架构师进阶,微服务设计与治理的 16 条常用原则

今天将从存储的上一层「服务维度」学习架构师的第二项常用能力 —— 微服务设计与治理。 如何设计合理的微服务架构&#xff1f; 如何保持微服务健康运行&#xff1f; 这是我们对微服务进行架构设计过程中非常关注的两个问题。 本文对微服务的生命周期定义了七个阶段&#x…

状态机的练习:按键控制led灯

设计思路&#xff1a; 三个按键控制led输出。 三个按键经过滤波(消抖)&#xff0c;产生三个按键标志信号。 三个led数据的产生模块&#xff08;流水&#xff0c;跑马&#xff0c;闪烁模块&#xff09;&#xff0c;分别产生led信号。 这六路信号&#xff08;三路按键信号&am…

Spring Boot 3.0 : 集成flyway数据库版本控制工具

目录 Spring Boot 3.0 : 集成flyway数据库版本控制工具flyway是什么为什么使用flyway主要特性支持的数据库&#xff1a; flyway如何使用spring boot 集成实现引入依赖配置sql版本控制约定3种版本类型 运行SpringFlyway 8.2.1及以后版本不再支持MySQL&#xff1f; 个人主页: 【⭐…

5组10个共50个音频可视化效果PR音乐视频制作模板

我们常常看到的图形跟着音乐跳动&#xff0c;非常有节奏感&#xff0c;那这个是怎么做到的呢&#xff1f;5组10个共50个音频可视化效果PR音乐视频制作模板满足你的制作需求。 PR音乐模板|10个音频可视化视频制作模板05 https://prmuban.com/36704.html 10个音频可视化视频制作…

Google Bard vs. ChatGPT 4.0:文献检索、文献推荐功能对比

在这篇博客中&#xff0c;我们将探讨和比较四个不同的人工智能模型——ChatGPT 3.5、ChatGPT 4.0、ChatGPT 4.0插件和Google Bard。我们将通过三个问题的测试结果来评估它们在处理特定任务时的效能和响应速度。 导航 问题 1: 统计自Vehicle Routing Problem (VRP)第一篇文章发…

人工智能-异步计算

异步计算 今天的计算机是高度并行的系统&#xff0c;由多个CPU核、多个GPU、多个处理单元组成。通常每个CPU核有多个线程&#xff0c;每个设备通常有多个GPU&#xff0c;每个GPU有多个处理单元。总之&#xff0c;我们可以同时处理许多不同的事情&#xff0c;并且通常是在不同的…

【K8S】Hello World

文章目录 1 搭建本地测试环境1.1 安装 docker和 Colima1.2 安装 minikube1.3 启动minikube1.4 安装 kubectl1.5 注册 docker hub镜像仓库 2 k8s核心资源概念2.1 Pod2.2 Deployment2.3 Service2.4 Ingress 参考资料 1 搭建本地测试环境 本文以 mac os为例 1.1 安装 docker和 C…

开放式黑白灰,现代风餐厨装修案例分享。福州中宅装饰,福州装修

你是否曾经遇到过这些问题&#xff1a;餐厅和厨房的装修风格不统一&#xff0c;导致整体效果不协调&#xff1b;收纳空间不足&#xff0c;导致物品杂乱无章&#xff1b;光线不足&#xff0c;导致烹饪时看不清楚食材等等。这些问题让你的生活变得不方便&#xff0c;甚至影响你的…

配置应用程序监听器[org.springframework.web.context.ContextLoaderListener]错误

首先查看自己的配置文件(我maven项目) web.xml(内容除了文件的配置位置外&#xff0c;是否有其他的不同) <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3…