代码环境:python3.6

递归实现

步骤:

  1. 从序列中挑出任意一个元素为pivot,此处选择序列最后一个元素,如果更改,需要相应变更以下步骤内容;
  2. 设置两个指针leftright,指向序列的最左和最右两个元素;
  3. left开始,找到第一个比pivot大的元素;切换到right,找到第一个比pivot小的元素;
  4. leftright此时指向的元素互换;
  5. 重复1-4步骤,直到left==right,将pivotleft对应的元素互换,这样以pivot分割左右两个区,左边元素都比pivot小,右边元素都比pivot大;
  6. 将两个分区分别递归重复1-5步骤,直到不可再分区,递归条件就是start<end

算法实现:

def partition(mylist, start, end):# 若选其他元素作为pivot,下面的while内容需要相应更改pivot = mylist[end]left = startright = endwhile left < right:while left < right and mylist[left] <= pivot:left += 1while left < right and mylist[right] >= pivot:right -= 1if left != right:mylist[left], mylist[right] = mylist[right], mylist[left]mylist[end], mylist[left] = mylist[left], pivotreturn leftdef quick_sort(mylist, start, end):"""mylist: 待排序的 liststart: mylist第一个元素索引end: mylist最后一个元素索引"""if start < end:mid = partition(mylist, start, end)quick_sort(mylist, start, mid - 1)quick_sort(mylist, mid + 1, end)if __name__ == "__main__":mylist = [12, 33, 199, 0, 54, 77, 11, 54, 9, 7]quick_sort(mylist, 0, len(mylist) - 1)print(f'快速排序后:{mylist}')

非递归实现

绝大多数用递归实现的问题,都可以用的方式来代替。

为什么?因为我们代码中一层层的方法调用,本身就是一个函数栈,每次进入一个新方法,就相当于入栈;每次有方法返回,就相当于出栈。

所以,我们可以利用栈存储每一次调用方法的参数。

算法实现:

class Stack():"""简单实现一个栈,本质就是个list"""def __init__(self):self.items = []def is_empty(self):return self.items == []def push(self, item):self.items.append(item)def pop(self):return self.items.pop()# 此方法与上面例子一样,保持不变
def partition(mylist, start, end):# 若选其他元素作为pivot,下面的while内容需要相应更改pivot = mylist[end]left = startright = endwhile left < right:while left < right and mylist[left] <= pivot:left += 1while left < right and mylist[right] >= pivot:right -= 1if left != right:mylist[left], mylist[right] = mylist[right], mylist[left]mylist[end], mylist[left] = mylist[left], pivotreturn leftdef quick_sort(mylist):stack = Stack()start = 0end = len(mylist) - 1if start < end:stack.push((start, end))while not stack.is_empty():start, end = stack.pop()mid = partition(mylist, start, end)if start < mid - 1:stack.push((start, mid - 1))if mid + 1 < end:stack.push((mid + 1, end))

python 快速排序_python-快速排序的两种方法相关推荐

  1. python文字教程-Python在图片中添加文字的两种方法

    本文主要介绍的是利用Python在图片中添加文字的两种方法,下面分享处理供大家参考学习,下来要看看吧 一.使用OpenCV 在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦.Ope ...

  2. python自带的shell是什么-python中执行shell的两种方法总结

    一.使用python内置commands模块执行shell commands对Python的os.popen()进行了封装,使用SHELL命令字符串作为其参数,返回命令的结果数据以及命令执行的状态: ...

  3. python怎么模拟浏览器交互_干货分享:python爬虫模拟浏览器的两种方法实例分析(赶紧收藏)...

    今天为大家带来的内容是:干货分享:python爬虫模拟浏览器的两种方法实例分析(赶紧收藏) 文章主要介绍了python爬虫模拟浏览器的两种方法,结合实例形式分析了Python爬虫模拟浏览器的两种常见操 ...

  4. 站长在线Python精讲:在Python中格式化字符串的两种方法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中格式化字符串的两种方法详解>.本知识点主要内容有:使用%操作符格式化字符串和使用format()方法格式化字 ...

  5. python 手动安装包的两种方法

    python 手动安装包的两种方法 对于 .tar.gz 的包来说 解压缩文件 aaaxxxx-1.0.1.tar.gz 移动到压缩文件所在目录 使用tar -zxvf aaaxxxx-1.0.1.t ...

  6. python画图颜色填充_python画图的两种方法

    python如何画图?这里给大家介绍两款python绘图的库:turtle和Matplotlib. 相关推荐:<python视频> 1 安装turtle Python2安装命令:pip i ...

  7. python简单绘图步骤_python画图的两种方法

    python如何画图?这里给大家介绍两款python绘图的库:turtle和Matplotlib. 1 安装turtle Python2安装命令:pip install turtule Python3 ...

  8. python list列表排序的两种方法及实例讲解

    对List进行排序,Python提供了两个方法 方法1.用List的内建函数list.sort进行排序 list.sort(func=None, key=None, reverse=False) Py ...

  9. python爬虫如何模仿登录_python爬虫:两种方法模拟登录博客园

    第一方法用第三方库(requests):参考http://www.mamicode.com/info-detail-1839685.html 源代码分析 博客园的登录页面非常简单,查看网页源代码,可以 ...

  10. python生成requirements.txt的两种方法

    python项目如何在另一个环境上重新构建项目所需要的运行环境依赖包? 使用的时候边记载是个很麻烦的事情,总会出现遗漏的包的问题,这个时候手动安装也很麻烦,不能确定代码报错的需要安装的包是什么版本.这 ...

最新文章

  1. 百度快照被劫持跳转的解决办法
  2. 使用命令创建mysql_用命令创建MySQL数据库
  3. 算法--06谷歌面试:字符串中第一个只出现一次的字符(Java实现)
  4. 第一阶段_第一部分_工具介绍
  5. asterisk1.8 for mipsel mysql
  6. 终于,我也到了和 Eclipse 说再见的时候,难说再见
  7. 找工作的人太多导致平台崩了?BOSS直聘回应:系统故障 已修复
  8. 使用 Xilinx Documentation Navigator 查看官方文档
  9. mysql主从复制延迟问题的相关知识与解决方案
  10. 手机号码归属地查询接口大全
  11. 有消息队列的地方,就有英特尔傲腾持久内存
  12. 阿里ACP云计算认证快速通关分享
  13. 利用windbg简单调试dump文件
  14. java.lang.NumberFormatException: null的解决方法
  15. 带你了解IT互联网行业程序员岗位有些什么类型?
  16. 【PostgreSQL】PostgreSQL的upsert功能(insert on conflict do)的用法
  17. latex做ppt模板
  18. HbuilderX使用方法
  19. LCD12864点阵型液晶显示器介绍
  20. 织梦插件-织梦插件大全-免费织梦插件大全

热门文章

  1. php int最大值探究
  2. 前端基础部分错题记录
  3. Flink 里程碑版本即将发布,快点入手
  4. Spark中foreachPartition和mapPartitions的区别
  5. Express-static
  6. 八段LED数码管段代码编码表
  7. ASP.NET中Server.MapPath() 和Request.MapPath()使用
  8. 在别人网页上运行js脚本_初始JavaScript,世界上最流行的语言之一
  9. 矩阵的特征向量和特征值
  10. 使用正则表达式实现将浮点数点左边的数每三位添加一个逗号