快速排序的四种python实现(推荐)


Posted in Python onApril 03, 2019

快速排序算法,简称快排,是最实用的排序算法,没有之一,各大语言标准库的排序函数也基本都是基于快排实现的。

本文用python语言介绍四种不同的快排实现。

1. 一行代码实现的简洁版本

quick_sort = lambda array: array if len(array) <= 1 else quick_sort([item for item in array[1:] if item <= array[0]]) + [array[0]] + quick_sort([item for item in array[1:] if item > array[0]])

2. 网上常见的快排实现

def quick_sort(array, left, right):
  if left >= right:
    return
  low = left
  high = right
  key = array[low]
  while left < right:
    while left < right and array[right] > key:
      right -= 1
    array[left] = array[right]
    while left < right and array[left] <= key:
      left += 1
    array[right] = array[left]
  array[right] = key
  quick_sort(array, low, left - 1)
  quick_sort(array, left + 1, high)

由于快排是原地排序,因此不需要返回array。

array如果是个列表的话,可以通过len(array)求得长度,但是后边递归调用的时候必须使用分片,而分片执行的原列表的复制操作,这样就达不到原地排序的目的了,所以还是要传上边界和下边界的。

3.《算法导论》中的快排程序

def quick_sort(array, l, r):
  if l < r:
    q = partition(array, l, r)
    quick_sort(array, l, q - 1)
    quick_sort(array, q + 1, r)
 
def partition(array, l, r):
  x = array[r]
  i = l - 1
  for j in range(l, r):
    if array[j] <= x:
      i += 1
      array[i], array[j] = array[j], array[i]
  array[i + 1], array[r] = array[r], array[i+1]
  return i + 1

这个版本跟上个版本的不同在于分片过程不同,只用了一层循环,并且一趟就完成分片,相比之下代码要简洁的多了。

4. 用栈实现非递归的快排程序

先说两句题外话,一般意义上的栈有两层含义,一层是后进先出的数据结构栈,一层是指函数的内存栈,归根结底,函数的内存栈的结构就是一个后进先出的栈。汇编代码中,调用一个函数的时候,修改的也是堆栈指针寄存器ESP,该寄存器保存的是函数局部栈的栈顶,另外一个寄存器EBP保存的是栈底。不知道与栈存储空间相对的堆存储空间,其组织结构是否也是一个完全二叉树呢?

高级语言将递归转换为迭代,用的也是栈,需要考虑两个问题:

1)栈里边保存什么?

2)迭代结束的条件是什么?

栈里边保存的当然是需要迭代的函数参数,结束条件也是跟需要迭代的参数有关。对于快速排序来说,迭代的参数是数组的上边界low和下边界high,迭代结束的条件是low == high。

def quick_sort(array, l, r):
  if l >= r:
    return
  stack = []
  stack.append(l)
  stack.append(r)
  while stack:
    low = stack.pop(0)
    high = stack.pop(0)
    if high - low <= 0:
      continue
    x = array[high]
    i = low - 1
    for j in range(low, high):
      if array[j] <= x:
        i += 1
        array[i], array[j] = array[j], array[i]
    array[i + 1], array[high] = array[high], array[i + 1]
    stack.extend([low, i, i + 2, high])

另外,当数组下标为-1时,C++、Java等语言中会报错,但python中访问的是最后一个元素,所以如果程序写错了,可能其他语言会报错,但python会输出一个错误的结果。

以上所述是小编给大家介绍的python实现快速排序算法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python转换HTML到Text纯文本的方法
Jan 15 Python
利用python实现简单的邮件发送客户端示例
Dec 23 Python
python如何拆分含有多种分隔符的字符串
Mar 20 Python
python实现一个简单的udp通信的示例代码
Feb 01 Python
Python爬虫爬取煎蛋网图片代码实例
Dec 16 Python
Python IDE环境之 新版Pycharm安装详细教程
Mar 05 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
Jan 09 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
Mar 02 Python
Python学习之异常中的finally使用详解
Mar 16 Python
搞定这套Python爬虫面试题(面试会so easy)
Apr 03 #Python
Python3实现从排序数组中删除重复项算法分析
Apr 03 #Python
Python3安装Pillow与PIL的方法
Apr 03 #Python
python使用requests模块实现爬取电影天堂最新电影信息
Apr 03 #Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
Apr 03 #Python
Python3实现计算两个数组的交集算法示例
Apr 03 #Python
Python3获取拉勾网招聘信息的方法实例
Apr 03 #Python
You might like
常用PHP框架功能对照表
2014/10/23 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
2016/06/13 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python中使用logging模块打印log日志详解
2015/04/05 Python
快速入手Python字符编码
2016/08/03 Python
python实现两个文件合并功能
2018/04/01 Python
python实现简单的文字识别
2018/11/27 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
读取nii或nii.gz文件中的信息即输出图像操作
2020/07/01 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
如何用 Python 制作一个迷宫游戏
2021/02/25 Python
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
Daniel Wellington官方海外旗舰店:丹尼尔惠灵顿DW手表
2018/02/22 全球购物
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
药学专业学生的自我评价分享
2014/02/06 职场文书
春节联欢晚会主持词
2014/03/24 职场文书
一年级评语大全
2014/04/23 职场文书
2015上半年个人工作总结
2015/07/27 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers