快速排序的非递归实现

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

快速排序非递归实现

        在学习非递归之前,我们先回顾一下,使用递归方法实现排序的方法,我们依旧采用第一种单趟排序的方法。这种方法单趟排序的目的就是最终找一个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.mzph.cn/news/221410.shtml

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

相关文章

双导师制的中国社科大-新加坡新跃社科大学工商管理博士

双导师制的中国社科大-新加坡新跃社科大学工商管理博士 论文采用双导师制&#xff0c;中新双方各安排一名导师&#xff0c;以社科大导师为主。导师学生双向选择&#xff0c;主要参考学生的研究方向。 中国社科大-新加坡新跃社科大学工商管理博士师资详情 中国社会科学院大学…

Halcon reduce_domain和scale_image的作用

在Halcon中&#xff0c;reduce_domain是用于缩小图像域&#xff08;Image Domain&#xff09;的操作。 它的作用是通过指定一个感兴趣区域&#xff08;ROI&#xff0c;Region of Interest&#xff09;&#xff0c;将图像数据限制在该区域内&#xff0c;从而实现对图像进行裁剪…

到底什么是DevOps

DevOps不是一组工具&#xff0c;也不是一个特定的岗位。在我看来DevOps更像是一种软件开发文化&#xff0c;一种实现快速交付能力的手段。 DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理&#xff0c;从而更快、更频繁地交付更稳定的…

UDP实现群聊

代码&#xff1a; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.IOException; import java.lang.String;public class liaotian extends JFrame{private static final int DEFAULT_PORT8899;private JLabel stateLB…

基于javaweb实现的实践教学基地管理系统

一、系统架构 前端&#xff1a;html | js | css | bootstrap 后端&#xff1a;spring | springmvc | mybatis-plus 环境&#xff1a;jdk1.8 | mysql8 | tomcat | maven 二、代码及数据库 三、功能介绍 01. web-首页1 02. web-首页2 03. web-首页3 04. web-首页4 05. 管…

【android开发-24】android中访问http协议网络以及解析xml格式数据的详细讲解

1&#xff0c;访问http协议网络 在Android中&#xff0c;使用HttpURLConnection访问网络的完整参考代码如下&#xff1a; 首先&#xff0c;创建一个名为HttpUtils的工具类&#xff0c;用于封装HTTP请求的方法。 import java.io.BufferedReader; import java.io.IOException;…

智慧运维:一体化管理软件解决方案

随着信息化时代的快速发展&#xff0c;各行各业对运维管理的要求越来越高。为了满足不断增长的需求&#xff0c;我们推出了一款全新的一体化监控运维软件。该软件采用综合运维系统&#xff0c;实现对云服务平台、大数据平台、智慧安防、业务软件、基础设施和安全防范设施的全方…

2024年邮件群发的优势

在当今数字化时代&#xff0c;随着社交媒体和移动应用的兴起&#xff0c;有些人可能会认为邮件营销已经过时了&#xff0c;不再是有效的营销方式。然而&#xff0c;事实并非如此。事实上&#xff0c;邮件营销仍然是一种强大而有效的工具&#xff0c;可以帮助企业建立品牌认知、…

【TC3xx】GETH

目录 一、RGMII 二、SMI接口 三、TC3xx MCAL 3.1 MCU 3.2 Port 3.3 DMA 3.4 中断配置 3.5 ETH 3.6 集成 一、RGMII TC3xx支持MII/RMII/RGMII三种以太网数据通信接口。其中RGMII经常用于MAC和MAC之间&#xff0c;或MAC与PHY之间的通信&#xff0c;RGMII的带宽可以是10M…

Soul 推出“SoulX”AI人工智能模型,已应用于旗下 App“苟蛋”AI聊天机器人

Soul社交平台最近发布了名为”SoulX“的AI人工智能模型&#xff0c;SoulX将作为Soul “AIGC社交”布局的重要基建&#xff0c;具备prompt驱动、条件可控生成、上下文理解、多模态理解等能力&#xff0c;垂直应用于平台上多元社交互动场景&#xff0c;如智能对话机器人、AI辅助聊…

为什么越来越多的人从事软件测试行业?

1.市场需求增加&#xff1a;随着数字化转型和互联网的普及&#xff0c;各行各业都需要高质量、稳定可靠的软件来支持其业务运作。因此&#xff0c;对软件测试人员的需求也随之增加。同时&#xff0c;新兴技术的发展&#xff0c;如物联网、大数据、区块链、人工智能等&#xff0…

图纸加密防泄密软件排名

随着科技的不断发展&#xff0c;图纸作为企业的核心资产&#xff0c;其安全性越来越受到重视。为了防止图纸泄露和被非法获取&#xff0c;许多企业开始采用图纸加密防泄密软件来保护自己的核心资产。 本文将介绍一些在市场上广受欢迎的图纸加密防泄密软件&#xff0c;并分析其优…

Spring 框架有哪些缺点?

目录 1、性能问题 2、配置复杂性 3、学习曲线 4、过度依赖Spring生态 5、过分依赖"魔法" 6、版本升级和兼容性问题 7、依赖注入的滥用 1、性能问题 缺点描述&#xff1a; Spring的依赖注入和AOP&#xff08;面向切面编程&#xff09;功能虽然提供了极大的灵活…

电话营销是如何影响企业的销售业绩的?

目前电话营销已经成为销售行业的一个重要分支。通过大量的拨打电话积累客户&#xff0c;效率比传统的陌拜高得多。 电话营销的概念和特点 电话营销是指企业通过电话这一渠道&#xff0c;向目标客户进行销售、市场推广、调查等活动的一种营销方式。具有以下特点&#xff1a; …

TSINGSEE青犀中央厨房视频智能监控监管解决方案

一、行业背景 预制菜是指经过洗、切、搭配、加工完成的菜品&#xff0c;采取冷冻或真空等一系列方式进行包装保存&#xff0c;消费者购买后只需通过简单烹调或直接开封即可食用&#xff0c;具有方便、高效、出品稳定的特点。据统计报告分析&#xff0c;从上游食材生产推算以及…

JVM虚拟机系统性学习-JVM相关工具jps、jstat、jinfo、jmap、jhat和jstack

JVM 相关工具 JDK 工具包 jps 查看 Java 进程 jps &#xff1a;列出Java程序进程ID和Main函数名称 jps -q &#xff1a;只输出进程ID jps -m &#xff1a;输出传递给Java进程&#xff08;主函数&#xff09;的参数 jps -l &#xff1a;输出主函数的完整路径 jps -v &#x…

LeetCode Hot100 148.排序链表

题目&#xff1a; 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 class Solution {public ListNode sortList(ListNode head) {return sortList(head, null);}private ListNode sortList(ListNode head, ListNode tail) {if (head null)retur…

深入解析MSSQL聚簇索引:加速查询的利器

在大数据时代&#xff0c;高效的数据库索引是保证系统性能的关键。而在MSSQL数据库中&#xff0c;聚簇索引是一项强大的技术&#xff0c;它能够极大地提升查询性能和数据访问效率。本文将深入探讨聚簇索引的原理、与其他索引的区别&#xff0c;以及适用的场景和关键技术点&…

【贪心】LeetCode-55. 跳跃游戏

55. 跳跃游戏。 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 …

回归预测 | MATLAB实现IBL-LSSVM【23年新算法】逻辑优化算法优化最小二乘支持向量机的数据回归预测 (多指标,多图)

回归预测 | MATLAB实现IBL-LSSVM【23年新算法】逻辑优化算法优化最小二乘支持向量机的数据回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现IBL-LSSVM【23年新算法】逻辑优化算法优化最小二乘支持向量机的数据回归预测 &#xff08;多指标…