快速排序的四种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 zip文件 压缩
Dec 24 Python
简介Python设计模式中的代理模式与模板方法模式编程
Feb 02 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
May 25 Python
Python中shapefile转换geojson的示例
Jan 03 Python
利用python实现在微信群刷屏的方法
Feb 21 Python
Python使用paramiko操作linux的方法讲解
Feb 25 Python
PyQt5创建一个新窗口的实例
Jun 20 Python
python3.6 tkinter实现屏保小程序
Jul 30 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
Nov 08 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
Python autoescape标签用法解析
Jan 17 Python
Django实现随机图形验证码的示例
Oct 15 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下过滤HTML代码的函数
2007/12/10 PHP
解析数组非数字键名引号的必要性
2013/08/09 PHP
Php header()函数语法及使用代码
2013/11/04 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
Javascript中Eval函数的使用
2010/03/23 Javascript
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
2010/06/19 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
jstree中的checkbox默认选中和隐藏示例代码
2019/12/29 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
列举Python中吸引人的一些特性
2015/04/09 Python
TensorFlow深度学习之卷积神经网络CNN
2018/03/09 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
python 使用plt画图,去除图片四周的白边方法
2019/07/09 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
对Django外键关系的描述
2019/07/26 Python
基于keras输出中间层结果的2种实现方式
2020/01/24 Python
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
如何转换一个字符串到enum值
2014/04/12 面试题
什么是Web Service?
2012/07/25 面试题
保卫科工作岗位职责
2014/03/01 职场文书
保证书格式范文
2014/04/28 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
创业计划书之美容店
2019/09/16 职场文书
使用pytorch实现线性回归
2021/04/11 Python
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python
浅析Python中的随机采样和概率分布
2021/12/06 Python
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫