快速排序的四种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中的类与对象之描述符详解
Mar 27 Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 Python
Python多进程multiprocessing用法实例分析
Aug 18 Python
详解Python中 sys.argv[]的用法简明解释
Dec 20 Python
python+matplotlib绘制3D条形图实例代码
Jan 17 Python
python判断输入日期为第几天的实例
Nov 13 Python
Python 移动光标位置的方法
Jan 20 Python
python SQLAlchemy 中的Engine详解
Jul 04 Python
基于h5py的使用及数据封装代码
Dec 26 Python
手把手教你安装Windows版本的Tensorflow
Mar 26 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
May 13 Python
Python Pygame实现俄罗斯方块
Feb 19 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
用PHP的ob_start();控制您的浏览器cache!
2006/11/25 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
PHP实现常用排序算法的方法
2020/02/05 PHP
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
jQuery实现的鼠标滚轮控制图片缩放功能实例
2017/10/14 jQuery
iview table高度动态设置方法
2018/03/14 Javascript
JS使用setInterval实现的简单计时器功能示例
2018/04/19 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
微信小程序实现的五星评价功能示例
2019/04/25 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python转换HTML到Text纯文本的方法
2015/01/15 Python
Python shutil模块用法实例分析
2019/10/02 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
Araks官网:纽约内衣品牌
2020/10/15 全球购物
前台接待的工作职责
2013/11/21 职场文书
通知函的格式
2015/04/27 职场文书
大学运动会加油稿
2015/07/22 职场文书
吧主申请感言怎么写
2015/08/03 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书