快速排序的四种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实现的去除win下文本文件头部BOM的代码
Feb 10 Python
在Django的上下文中设置变量的方法
Jul 20 Python
Python信息抽取之乱码解决办法
Jun 29 Python
详解python中的文件与目录操作
Jul 11 Python
启动targetcli时遇到错误解决办法
Oct 26 Python
异步任务队列Celery在Django中的使用方法
Jun 07 Python
pyshp创建shp点文件的方法
Dec 31 Python
深入浅析Python中的迭代器
Jun 04 Python
django实现web接口 python3模拟Post请求方式
Nov 19 Python
在django中使用post方法时,需要增加csrftoken的例子
Mar 13 Python
Python astype(np.float)函数使用方法解析
Jun 08 Python
python 基于opencv 实现一个鼠标绘图小程序
Dec 11 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 简单数组排序实现代码
2009/08/05 PHP
简单的cookie计数器实现源码
2013/06/07 PHP
PHP 常用的header头部定义汇总
2015/06/19 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
javascript div 遮罩层封锁整个页面
2009/07/10 Javascript
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
基于jQuery的动态表格插件
2011/03/28 Javascript
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
window.opener用法和用途实例介绍
2013/08/19 Javascript
cookie中的path与domain属性详解
2013/12/18 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
2014/07/06 Javascript
JS实现点击上移下移LI行数据的方法
2015/08/05 Javascript
Javascript函数式编程简单介绍
2015/10/11 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
详细分析Node.js 多进程
2020/06/22 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
[01:02:03]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS VG
2014/05/26 DOTA
[01:07:46]完美世界DOTA2联赛循环赛 Magma vs IO BO2第二场 11.01
2020/11/02 DOTA
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
viagogo法国票务平台:演唱会、体育比赛、戏剧门票
2017/03/27 全球购物
美国一家运动专业鞋类零售商:Warehouse Shoe Sale(WSS)
2018/03/28 全球购物
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
简单而又朴实的个人求职信分享
2013/12/12 职场文书
安全保证书
2015/01/16 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
用Python提取PDF表格的方法
2021/04/11 Python