python 快速排序_python-快速排序的两种方法
代码环境:python3.6
递归实现
步骤:
- 从序列中挑出任意一个元素为
pivot
,此处选择序列最后一个元素,如果更改,需要相应变更以下步骤内容; - 设置两个指针
left
和right
,指向序列的最左和最右两个元素; - 从
left
开始,找到第一个比pivot
大的元素;切换到right
,找到第一个比pivot
小的元素; - 将
left
和right
此时指向的元素互换; - 重复
1-4
步骤,直到left==right
,将pivot
和left
对应的元素互换,这样以pivot
分割左右两个区,左边元素都比pivot
小,右边元素都比pivot
大; - 将两个分区分别递归重复
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-快速排序的两种方法相关推荐
- python文字教程-Python在图片中添加文字的两种方法
本文主要介绍的是利用Python在图片中添加文字的两种方法,下面分享处理供大家参考学习,下来要看看吧 一.使用OpenCV 在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦.Ope ...
- python自带的shell是什么-python中执行shell的两种方法总结
一.使用python内置commands模块执行shell commands对Python的os.popen()进行了封装,使用SHELL命令字符串作为其参数,返回命令的结果数据以及命令执行的状态: ...
- python怎么模拟浏览器交互_干货分享:python爬虫模拟浏览器的两种方法实例分析(赶紧收藏)...
今天为大家带来的内容是:干货分享:python爬虫模拟浏览器的两种方法实例分析(赶紧收藏) 文章主要介绍了python爬虫模拟浏览器的两种方法,结合实例形式分析了Python爬虫模拟浏览器的两种常见操 ...
- 站长在线Python精讲:在Python中格式化字符串的两种方法详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中格式化字符串的两种方法详解>.本知识点主要内容有:使用%操作符格式化字符串和使用format()方法格式化字 ...
- python 手动安装包的两种方法
python 手动安装包的两种方法 对于 .tar.gz 的包来说 解压缩文件 aaaxxxx-1.0.1.tar.gz 移动到压缩文件所在目录 使用tar -zxvf aaaxxxx-1.0.1.t ...
- python画图颜色填充_python画图的两种方法
python如何画图?这里给大家介绍两款python绘图的库:turtle和Matplotlib. 相关推荐:<python视频> 1 安装turtle Python2安装命令:pip i ...
- python简单绘图步骤_python画图的两种方法
python如何画图?这里给大家介绍两款python绘图的库:turtle和Matplotlib. 1 安装turtle Python2安装命令:pip install turtule Python3 ...
- python list列表排序的两种方法及实例讲解
对List进行排序,Python提供了两个方法 方法1.用List的内建函数list.sort进行排序 list.sort(func=None, key=None, reverse=False) Py ...
- python爬虫如何模仿登录_python爬虫:两种方法模拟登录博客园
第一方法用第三方库(requests):参考http://www.mamicode.com/info-detail-1839685.html 源代码分析 博客园的登录页面非常简单,查看网页源代码,可以 ...
- python生成requirements.txt的两种方法
python项目如何在另一个环境上重新构建项目所需要的运行环境依赖包? 使用的时候边记载是个很麻烦的事情,总会出现遗漏的包的问题,这个时候手动安装也很麻烦,不能确定代码报错的需要安装的包是什么版本.这 ...
最新文章
- 百度快照被劫持跳转的解决办法
- 使用命令创建mysql_用命令创建MySQL数据库
- 算法--06谷歌面试:字符串中第一个只出现一次的字符(Java实现)
- 第一阶段_第一部分_工具介绍
- asterisk1.8 for mipsel mysql
- 终于,我也到了和 Eclipse 说再见的时候,难说再见
- 找工作的人太多导致平台崩了?BOSS直聘回应:系统故障 已修复
- 使用 Xilinx Documentation Navigator 查看官方文档
- mysql主从复制延迟问题的相关知识与解决方案
- 手机号码归属地查询接口大全
- 有消息队列的地方,就有英特尔傲腾持久内存
- 阿里ACP云计算认证快速通关分享
- 利用windbg简单调试dump文件
- java.lang.NumberFormatException: null的解决方法
- 带你了解IT互联网行业程序员岗位有些什么类型?
- 【PostgreSQL】PostgreSQL的upsert功能(insert on conflict do)的用法
- latex做ppt模板
- HbuilderX使用方法
- LCD12864点阵型液晶显示器介绍
- 织梦插件-织梦插件大全-免费织梦插件大全