本文首发地址:

https://yishuihancheng.blog.csdn.net/article/details/76185032

欢迎关注我的博客【Together_CZ】,我是沂水寒城!

今天在做题的时候突然想到一个问题,递归写出来的算法是否可以改成非递归的形式,查了一些资料发现:网上很多都说只要是递归可以写成的程序都是可以改成非递归形式的,关于递归的算法有很多的说法

递归的优点:

这个不用多说,递归写出来的程序和算法很清晰,甚至树的前序遍历和后序遍历这样复杂的代码都可以用不超过十行的递归代码来完成,在排序中,快速排序是一个很典型的例子,使用递归的话也可以不超过十行就实现一个功能强大的,可读性很好的排序算法,但是真的你明白递归的背后程序在干什么事情吗?程序是如何调用的,调用的层次和路线是什么,在堆栈中保存了什么?恐怕不是所有人都明白的,正如面试的时候说的:你可能很容易就使用递归的方法写出来一个树的遍历或者快排算法,但是真的改成非递归的方式的话就比较考验水平了,的确是这样的

递归的缺点:

递归的缺点也很明显,由于需要系统的堆栈那么使用的空间开销势必就会比非递归算法大很多,还需要保存一些必要信息如:保护现场,那么递归就会占用很多的资源,还有一个致命的问题就是:如果递归的深度太大的话可能是会造成栈溢出的

不过一般的学习工作中还是偏向于使用递归的代码,毕竟节省很大的精力时间和资源,如果想要加深对程序调用、执行的理解的话可是尝试一下转化递归的代码为非递归的代码,一个思路就是使用迭代或者模拟栈的操作来取代递归。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。递归算法与迭代算法的设计思路区别在于:函数或算法是否具备收敛性,当且仅当一个算法存在预期的收敛效果时,采用递归算法才是可行的,否则,就不能使用递归算法。 当然,从理论上说,所有的递归函数都可以转换为迭代函数,反之亦然,然而代价通常都是比较高的。

好了,关于递归的闲聊就到了这样,今天的目的是使用模拟栈的操作来实现非递归形式的快速排序算法,做法也很简单只是模拟了栈的基本操作,使用栈的压入和弹出来取代了原始的递归调用。

下面是具体的实现:

#!usr/bin/env python #encoding:utf-8  ''''' __Author__:沂水寒城 功能:模拟栈操作实现非递归的快速排序'''  import random import time  class stack(object): def __init__(self,size): ''' 初始化得到一个空栈 ''' self.size=size self.stack=[]   def __str__(self): ''' 返回栈内容 ''' return str(self.stack)    def getSize(self): ''' 获取栈当前的大小 ''' return len(self.stack)    def push(self,ele): ''' 将一个元素压入栈中 ''' if self.isfull(): raise Exception('Empty Stack!!!') self.stack.append(ele)   def top(self): ''' 返回栈顶元素 ''' if self.isempty(): raise Exception('Empty Stack!!!') return self.stack[-1]   def pop(self): ''' 弹出栈顶元素 ''' if self.isempty(): raise Exception('Empty Stack!!!') topElement=self.stack[-1] self.stack.remove(topElement)   def isempty(self): ''' 判断栈是否为空 ''' if len(self.stack)==0: return True return False   def isfull(self): ''' 判断当前栈是否已满 ''' if len(self.stack)==self.size: return True return False  def random_nums_generator(max_value=1000, total_nums=20):  '''''  随机数列表生成器  一些常用函数:  random随机数生成  random.random()用于生成一个0到1之间的随机数:0 <= n < 1.0;  random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。min(a,b) <= n <= max(a,b);  randdom.randint(a, b), 用于生成一个指定范围内的整数,其中a是下限,b是上限: a<= n <= b;  random.randrange(start, stop, step), 从指定范围内,按指定基数递增的集合获取一个随机数;  random.choice(sequence), 从序列中获取一个随机元素;  random.shuffle(x), 用于将一个列表中的元素打乱;  random.sample(sequence, k), 从指定序列中随机获取指定长度的片断;  '''  num_list=[]  for i in range(total_nums):  num_list.append(random.randint(0,max_value))  return num_list   def quick_sort(num_list,start,end): ''' 模拟栈操作实现非递归的快速排序 ''' stackTest=stack(len(num_list)) if startindex+1: stackTest.push(r) stackTest.push(index+1) return num_list  def partition(num_list,start,end): ''' 划分函数,返回划分出下标 ''' base=num_list[start] while start=base: end-=1  num_list[start]=num_list[end] while start

测试结果输出如下:

由于结果量巨大就不粘贴出来了,感兴趣的话可以去我的博文中查看,这里只给出来运行时间的输出结果:

第0次运行时间为:0.157833099365第1次运行时间为:2.17199325562第2次运行时间为:40.4109954834第3次运行时间为:1219.03705597

可以简单看一下:

数据量从20-->200-->2000->20000所用时间的消耗

c语言栈的实现以及操作_python模拟栈的操作实现非递归方式的快速排序算法相关推荐

  1. 二叉树非递归后序遍历算法(C语言)

    二叉树非递归后序遍历算法(C语言) 二叉树后序遍历的规律:左右根 后序非递归遍历中,访问根(子根)结点有两种情况 ①:遍历完左子树,需要遍历右子树,需要从栈中访问最顶上的根(子根)结点从而得到右子树的 ...

  2. python全栈指的是什么_python全栈指的是什么意思

    Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发. 那么pyt ...

  3. python模拟鼠标点击和键盘输入的操作_python模拟鼠标点击和键盘输入的操作

    所有代码都是网上百度出来的,通过个人实践找到适合自己的. 采用的python 库是 pymouse.pykeyboard 安装时直接pip安装的,pip install PyUserInput 安装不 ...

  4. python全栈指的是什么_python全栈指的是什么

    python全栈指的是什么? 全栈即指的是全栈工程师,指掌握多种技能,并能利用多种技能独立完成产品的人.就是与这项技能有关的都会,都能够独立的完成. 全栈只是个概念,也分很多种类.真正的全栈工程师涵盖 ...

  5. python安卓脚本 模拟滑动_python模拟鼠标拖动操作的方法

    本文实例讲述了python模拟鼠标拖动操作的方法.分享给大家供大家参考.具体如下: pdf中的书签只有页码,准备把现有书签拖到一个目录中,然后添加自己页签.重复的拖动工作实在无趣,还是让程序帮我实现吧 ...

  6. SCU4438 Censor(审查员) (KMP算法与模拟栈的应用 || HASH表与模拟栈的结合)

    Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text pp. Her j ...

  7. PHP高级计算器的过程,PHP使用栈完成高级计算器-接上文模拟栈

    距离上一篇文章PHP模拟栈,小梦就答应了小伙伴们要使用栈来完成一个实战的例子,今天就给大家带来了这个例子,让大家更加深入理解它的使用场景! 当出现'3+4*3-2'这个字符串的时候,我们头脑中会有很多 ...

  8. python模拟鼠标点击和键盘输入的操作_Python模拟鼠标点击及键盘输入(PyUserInput)...

    一.背景 有时可以通过程序来监控键盘或鼠标行为来触发鼠标的点击或者键盘的输入,类似于按键精灵,而Python是门简洁易实现的语言,同时PyUserInput库简单封装了底层的调用. 整篇文章以Wind ...

  9. python json文件操作_python对json的操作总结

    引言 你一定听说过 JSON 吧.JSON 是当前最常用的数据传输格式之一,纯文本,容易使用,方便阅读,最重要的是在多个场合都被大量被使用. 既然 JSON 这么好,那就让我们继续探险,去掌握 pyt ...

最新文章

  1. 将ALV GRID中改变的值更新到ALV内表中
  2. CSS中的a标签几个访问状态记录
  3. 数学--数论--二次探测定理
  4. Docker 安装nginx,并挂载文件
  5. c#中的socket(tcp)
  6. HEU 5039 Move Woods
  7. Shell脚本之grep
  8. BZOJ1041:[HAOI2008]圆上的整点(数论)
  9. 谭浩强C语言第四版第九章课后习题7--9题(建立,输出,删除,插入链表处理)...
  10. 谷歌力推新语言 Logica,解决 SQL 重大缺陷!
  11. 在mac中配置apache+php5.3+mysql的环境,修改hosts
  12. MySQL面试题中:主从同步部署介绍
  13. 去除vss源代码管理
  14. (Kinetis K60) FTM输出PWM
  15. 20+免费精美响应式Html5 网站模板01(含源码)
  16. chrome浏览器小恐龙自动跑
  17. java 长字符串变短_如何将一个很长的String变短,再根据短的String还原?
  18. 李宏毅 机器学习 2016 秋:5、Classification:Probabilistic Generative Model
  19. 第六章 颠覆与重塑思维,大数据与思维革命
  20. 微信内置浏览器不支持下载的解决方案 微信点击链接直接下载app安装包功能实现方式

热门文章

  1. MySQL函数少传参数_Mysql中的少用函数
  2. 规划系统_智慧水务规划系统思维的设计思考
  3. 抓住\留住用户的引导页长什么样?
  4. PSD分层情人节海报模板,让人眼前一亮
  5. UI设计素材|底部导航设计的黄金法则
  6. 类似色/同色系电商海报模板,PSD分层模板
  7. 电商夏季促销海报设计PSD模板,分解教你如何设计
  8. input自适应_一种Dynamic ReLU:自适应参数化ReLU激活函数(调参记录13)
  9. Mac精品软件分享第一期
  10. C++设计模式详解之外观模式解析