快速排序的非递归实现

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

快速排序非递归实现

        在学习非递归之前,我们先回顾一下,使用递归方法实现排序的方法,我们依旧采用第一种单趟排序的方法。这种方法单趟排序的目的就是最终找一个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,一经查实,立即删除!

相关文章

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. 管…

【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;并分析其优…

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…

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

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

计算机网络:运输层

0 本节主要内容 问题描述 解决思路 1 问题描述 1.1 知识回顾 利用如下拓扑对前面的知识进行回顾。 问题&#xff1a;源主机 H 1 \textrm{H}_1 H1​要和目的主机 H 2 \textrm{H}_2 H2​进行通信&#xff0c;源主机 H 1 \textrm{H}_1 H1​要构建数据包封装来自应用层的数据。…

【产品应用】一体化伺服电机在TO全自动封焊机中的应用

随着科技的飞速发展&#xff0c;自动化设备在各行各业中的应用越来越广泛。在电子制造领域&#xff0c;封焊机是关键设备之一&#xff0c;其性能直接影响产品的质量和产量。近年来&#xff0c;一体化伺服电机在TO全自动封焊机中的应用逐渐受到关注。本文将详细介绍一体化伺服电…

变电站蓄电池在线监测系统(论文+源码)

1. 系统设计 本次课题为变电站蓄电池在线监测系统的设计&#xff0c;其系统架构如图3.1所示&#xff0c;包括了主控制器STC89C52单片机&#xff0c;液晶显示器LCD1602,模数转换器ADC0832&#xff0c;电流传感器ACS712&#xff0c;分压电阻&#xff0c;蜂鸣器以及温度传感器。在…

JAVA 版多商家入驻 直播带货 商城系统 B2B2C 之 鸿鹄云商B2B2C产品概述

随着互联网的快速发展&#xff0c;越来越多的企业开始注重数字化转型&#xff0c;以提升自身的竞争力和运营效率。在这个背景下&#xff0c;鸿鹄云商SAAS云产品应运而生&#xff0c;为企业提供了一种简单、高效、安全的数字化解决方案。 鸿鹄云商SAAS云产品是一种基于云计算的软…

总结一篇本地idea配合阿里云服务器使用docker

idea打包打镜像发到阿里云服务器 为什么写这篇文章呢&#xff0c;就是这一整套流程我在网上没有看到完整的&#xff0c;有完整的也是要收费才能看&#xff0c;所以自己摸索了&#xff0c;自己踩过坑&#xff0c;想让兄弟们不仅能白嫖&#xff0c;还不踩坑&#xff01; 先说一…

C++ 运算符重载 (备查)

基础 运算符重载&#xff0c;就是对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型。 运算符重载也可以发生函数重载。 语法&#xff1a; void operator(); //代表了被重载的运算符。函数的参数个数取决于两个因素。1)运算符是一元(一…

数据结构和算法-图的基本操作以图的广度优先遍历和深度优先遍历

文章目录 图的基本操作总览找边列出与某顶点相连的边插入顶点删除顶点增加边顶点的第一个邻接点顶点的下一个邻接点设置或者获取某条边的权值总览 图的广度优先遍历总览树的广度优先遍历图的广度优先遍历树vs图图广度优先遍历的代码实现广度优先遍历序列遍历序列的可变性算法存…

深眸科技|轻辙视觉引擎以99.9%视觉检测能力为基准,赋能木材加工

轻辙视觉引擎&#xff1a;轻辙视觉引擎是以低代码为基础&#xff0c;深度学习技术为核心的视觉业务流程编排引擎&#xff0c;用于快速搭建部署复杂视觉检测流程软件方案。 轻辙视觉引擎&#xff5c;轻量级产品实现高效应用 作为深眸科技的核心产品之一&#xff0c;轻辙视觉引…