排序(7)——非递归快排

前面我们已经写了快排用递归的方法实现,在数据量大的时候,有可能会栈溢出。这里我们尝试一下改为非递归

区分:

  • 数据结构的栈——利用的是内存中的堆空间
  • 内存的栈——利用就是内存中的栈空间——函数创建函数栈帧
  • 堆的空间是远远大于栈的空间

递归 -> 非递归

  1. 循环  一般递归可以改为非递归的话,就说明这个题目用循环来写会更顺。有些题目不好改为非递归,比如二叉树的前序遍历。
  2. 借助栈。 

基本思路

注意栈后进先出的特性。

  • 首先入栈单趟排序的区间,然后出栈确定left和right,单趟排序确定keyi。接下来根据新的keyi再次入栈单趟排序的区间。
  • 对于区间,先入end,再入begin。先出begin,再出end。对于子问题,先入右序列,再入左序列。先出左序列,再出右序列。(对应于递归先递归左边再递归右边。)
  • 递归:把子问题放到函数栈帧(借助栈的空间)
  • 非递归:把子问题放到数据结构的栈(借助堆的空间)
  • 不是递归胜似递归。

代码实现

  • 入栈的条件left < right。
  • 栈不为空就继续,栈为空就结束。
  • 对于区间,先入end,再入begin。先出begin,再出end。对于子问题,先入右序列,再入左序列。先出左序列,再出右序列。
  • 一定要记得赋值完left和right后要出栈
void QuickSortNonR(int* a, int begin, int end)
{
	ST s;
	STInit(&s);
	STPush(&s, end); //先进end
	STPush(&s, begin); //再进begin

	while (!STempty(&s))
	{
		int left = STTop(&s); //取begin为left
		STPop(&s); //begin出栈
		int right = STTop(&s); //取end为right
		STPop(&s); //end出栈

		int keyi = PartSort3(a, left, right); //单趟排序取新keyi
		// [left, keyi-1] keyi [keyi+1, right]
        //如果子区间不是left==right或者无数据

        if (keyi + 1 < right)
        //处理右区间
		{
			STPush(&s, right); //先入end
			STPush(&s, keyi + 1); //再入begin
		}

		if (left < keyi - 1) 
        //处理左区间
		{
			STPush(&s, keyi - 1); //先入end 
			STPush(&s, left); //再入begin
		}
		
	}

	STDestroy(&s);
}

图解分析

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

突破编程_前端_JS编程实例(目录导航)

1 开发目标 目录导航组件旨在提供一个滚动目录导航功能&#xff0c;使得用户可以方便地通过点击目录条目快速定位到对应的内容标题位置&#xff0c;同时也能够随着滚动条的移动动态显示当前位置在目录中的位置&#xff1a; 2 详细需求 2.1 标题提取与目录生成 组件需要能够自…

Transformer之多角度解读

Transformer 文章目录 Transformer  &#x1f449;引言&#x1f48e; 一、 自注意力机制 &#xff1a; 主要用于 长距离依赖捕捉和转换序列二、 Encoder&#xff1a;2.1 多头注意力机制&#xff1a;2.2 残差连接&#xff1a; 三、 Decoder&#xff1a;3.1 Decoder 多头注意力…

SMART PLC自适应低通滤波器(收放卷线速度滤波)

一阶低通滤波器更多内容请参考信号处理专栏相关文章,常用链接如下: 1、SMART PLC 低通滤波器和模拟量采集应用 https://rxxw-control.blog.csdn.net/article/details/136595982https://rxxw-control.blog.csdn.net/article/details/1365959822、SMART PLC双线性变换和后向差…

腾讯云服务器99元一年购买链接来了,续费也是99元

良心腾讯云推出99元一年服务器&#xff0c;新用户和老用户均可以购买&#xff0c;续费不涨价&#xff0c;续费也是99元&#xff0c;配置为轻量2核2G4M、50GB SSD盘、300GB月流量、4M带宽&#xff1a;优惠价格99元一年&#xff0c;续费99元&#xff0c;官方活动页面 txybk.com/g…

【STM32】STM32F4中USART的使用方法和Printf的重定义(基于CubeMX和Keil)

文章目录 一、前言二、STM32CubeMX生成代码2.1 选择芯片2.2 配置相关模式2.3 生成代码 三、Keil重定义Printf3.1 勾选“UseMicroLIB”3.2 添加头文件和修改fputc和fgetc 四、测试Printf的效果4.1 字符串测试4.2 格式化输出测试 五、存在问题的解决方法5.1 检查串口号是否一致5.…

由于找不到vcruntime140.dll无法继续执行的多种解决方法

最近&#xff0c;我在安装Adobe Premiere Pro&#xff08;以下简称PR&#xff09;时遇到了一个问题&#xff0c;即无法找到vcruntime140.dll文件。这可能导致某些应用程序无法正常启动或运行&#xff0c;因为vcruntime140.dll是许多基于Microsoft Visual C编译的应用程序所必需…

【中医】康复科治疗与中医养生(针灸、理疗、足浴)

程序员生活指南之 【中医】康复治疗与中医养生&#xff08;针灸、理疗、足浴&#xff09; 文章目录 1、康复科室2、中医与养生3、中医康复技术 1、康复科室 什么是康复科&#xff1f; 大部分医院都有康复科&#xff0c;但很多人都不知其具体是干什么的。其实&#xff0c;康复…

考研常识 | 专业硕士与学术硕士的11个区别

专业硕士与学术硕士的11个区别 对于考研学子而言&#xff0c;了解专业学位与学术学位的区别&#xff0c;是报考的第一步。学术学位研究生一般都是全日制的&#xff0c;而专业学位研究生的学习方式还分为即全日制与非全日制两种。这篇文章将带大家认识全日制专业学位与全日制学术…

LCR 131. 砍竹子 I

解题思路&#xff1a;&#xff08;与砍竹子II的区别是&#xff0c;这里的竹子长度数量级较小&#xff09; 数学推导或贪心 切分规则&#xff1a; 等长&#xff0c;且尽量为3 b0时&#xff0c;pow(3,a) b1时&#xff0c;pow(3,a-1)*4 少一段3&#xff0c;并入b生成一…

【数据结构】Map的常用方法

文章目录 一、搜索1.概念 二、Map的使用1.概念&#xff1a;2.Map的常用方法&#xff1a;1.V put(K Key ,V Value )2.V get(Object key)3.V getOrDefault(Object key, V defaultValue)4.V remove(Object key)5.Set<K> keySet()6.Collection<V> values()7.Set<Map…

连锁门店终端如何高效IT运维?向日葵助力服装行业数字化升级

服装行业作为典型的传统行业&#xff0c;因供应逐渐饱和、产能相对过剩以及消费结构升级&#xff0c;其销售端的数字化转型需求是最为迫切的。 为此&#xff0c;某知名时装品牌紧抓数字化转型机遇&#xff0c;在2016年起就开始了数字化变革&#xff0c;并在两年多的时间里完成…

配置与管理DNS服务器

配置与管理DNS服务器 **1&#xff0c;什么是DNS&#xff1f;**负责将域名转换成实际想对应的ip地址&#xff0c;这个过程交域名解析。 **2&#xff0c;域名解析的方法&#xff1a;**分布式&#xff0c;层次结构的数据库系统。根域&#xff0c;顶级域&#xff0c;二级域&#…

MyBatis是纸老虎吗?(二)

从二月二十六号开始&#xff0c;我就要求自己出一期与MyBatis有关的文章&#xff0c;直到三月三号那天才发表第一篇文章。这速度&#xff0c;这质量&#xff0c;着实堪忧。经过这件事&#xff0c;我也深刻认识到自己性格上的缺陷——懒惰。为了克服这个坏毛病&#xff0c;我决定…

使用Julia语言和R语言实现K-均值

K-均值算法基础 K-均值聚类算法属于一种无监督学习的方法&#xff0c;通过迭代的方式将数据划分为K个不重叠的子集&#xff08;簇&#xff09;&#xff0c;每个子集由其内部数据点的平均值来表示。计算方法大体如下&#xff1a; 1.初始化簇中心 选择K个数据点作为初始的簇中心…

LLM RAG系统中消除数据幻觉的几个绝招-OPENAI公司内称的“大招”

前言-什么是数据幻觉&#xff1f;它到底有什么危害呢 我们直接来举例&#xff1a; 我是金银花一区的&#xff0c;附近有什么小学&#xff1f; 此时RAG带出如下信息&#xff1a; 金银花小区一区、二区、三区附近教育资源有&#xff1a;银树大学、建设小学金银花校区、金树高…

IMX8MM -- Yocto构建遇见的错误及解决方法:

IMX8MM Yocto构建遇见的错误及解决方法&#xff1a; 1 bison-3.0.4 error2 Opencv BB_NO_NETWORK Error &#xff1a;3 Yocto构建时出现U-boot 问题4 Yocto构建时出现Linux kernel编译问题5 wayland-native6 cross-localedef-native7 wayland-protocols8 mesa 硬件&#xff1a;…

React Navite环境搭建

React Navite官网地址 React Native 中文网 使用React来编写原生应用的框架 创建React Navite项目命令&#xff08;目录必须是英文&#xff09; npx react-nativelatest init AwesomeProject 如果你是想把 React Native 集成到现有的原生项目中&#xff0c;则步骤完全不同…

多项式回归算法模拟

import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures# 生成随机数作为x变量&#xff0c;范围在-5到5之间&#xff0c;共500个样本 x np.random.uniform(-5, 5, siz…

Java开发从入门到精通(一):Java的进阶语法知识

Java大数据开发和安全开发 Java的方法1.1 方法是什么1.1.1 方法的定义1.1.2 方法如何执行?1.1.3 方法定义时注意点1.1.4 使用方法的好处是? 1.2 方法的多种形式1.2.1 无参数 无返回值1.2.2 有参数 无返回值 1.3 方法使用时的常见问题1.4 方法的设计案例1.4.1 计算1-n的和1.4.…

[C/C++]string类常用接口介绍及模拟实现string类

一&#xff1a;Cstring类的由来 在C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用…