快速排序的四种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实现批量下载文件
May 17 Python
Python实现将Excel转换为json的方法示例
Aug 05 Python
利用numpy和pandas处理csv文件中的时间方法
Apr 19 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
浅谈python脚本设置运行参数的方法
Dec 03 Python
django框架实现一次性上传多个文件功能示例【批量上传】
Jun 19 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
Apr 14 Python
如何基于线程池提升request模块效率
Apr 18 Python
打印tensorflow恢复模型中所有变量与操作节点方式
May 26 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
Python判断远程服务器上Excel文件是否被人打开的方法
Jul 13 Python
提取视频中的音频 Python只需要三行代码!
May 10 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
Zend framework处理一个http请求的流程分析
2010/02/08 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
js确定对象类型方法
2012/03/30 Javascript
jQuery列表拖动排列具体实现
2013/11/04 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
微信小程序获取微信运动步数的实例代码
2017/07/20 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
基于python 二维数组及画图的实例详解
2018/04/03 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
tensorflow指定CPU与GPU运算的方法实现
2020/04/21 Python
python使用多线程+socket实现端口扫描
2020/05/28 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
《云雀的心愿》教学反思
2014/02/25 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
爱岗敬业演讲稿
2014/05/05 职场文书
会计工作岗位职责
2015/02/03 职场文书
文员岗位职责范本
2015/04/16 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
杨善洲观后感
2015/06/04 职场文书
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android