快速排序的四种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字符串排序方法
Aug 29 Python
Python模块搜索路径代码详解
Jan 29 Python
Python yield与实现方法代码分析
Feb 06 Python
Pycharm配置远程调试的方法步骤
Dec 17 Python
Python面向对象程序设计之类的定义与继承简单示例
Mar 18 Python
树莓派安装OpenCV3完整过程的实现
Oct 10 Python
python实现的读取网页并分词功能示例
Oct 29 Python
Django查询优化及ajax编码格式原理解析
Mar 25 Python
PyTorch在Windows环境搭建的方法步骤
May 12 Python
Pyinstaller加密打包应用的示例代码
Jun 11 Python
Python如何创建装饰器时保留函数元信息
Aug 07 Python
Python如何获取文件路径/目录
Sep 22 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开发框架的对比
2013/07/05 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
jquery JSON的解析方式
2009/07/25 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
jquery 的 $(&quot;#id&quot;).html() 无内容的解决方法
2010/06/07 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
js获取checkbox值的方法
2015/01/28 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
bootstrap多种样式进度条展示
2016/12/20 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
关于vue.extend和vue.component的区别浅析
2017/08/16 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
JS 实现百度搜索功能
2018/02/01 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
vue打开新窗口并实现传参的图文实例
2021/03/04 Vue.js
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
Python通过poll实现异步IO的方法
2015/06/04 Python
浅析python3字符串格式化format()函数的简单用法
2018/12/07 Python
pytorch 更改预训练模型网络结构的方法
2019/08/19 Python
python代码如何实现余弦相似性计算
2020/02/09 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
为什么要使用servlet
2016/01/17 面试题
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
总经理秘书的岗位职责
2013/12/27 职场文书
经济管理自荐书
2014/06/09 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
python缺失值的解决方法总结
2021/06/09 Python
Window server中安装Redis的超详细教程
2021/11/17 Redis
python运算符之与用户交互
2022/04/13 Python