快速排序的四种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 相关文章推荐
web.py获取上传文件名的正确方法
Aug 26 Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 Python
python如何实现excel数据添加到mongodb
Jul 30 Python
Python创建对称矩阵的方法示例【基于numpy模块】
Oct 12 Python
Python 实现引用其他.py文件中的类和类的方法
Apr 29 Python
深入分析python中整型不会溢出问题
Jun 18 Python
78行Python代码实现现微信撤回消息功能
Jul 26 Python
DES加密解密算法之python实现版(图文并茂)
Dec 06 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
Python内置数据结构列表与元组示例详解
Aug 04 Python
Django基础CBV装饰器和中间件
Mar 22 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 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
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
php分页函数示例代码分享
2014/02/24 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
ext 同步和异步示例代码
2009/09/18 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
深入浅析JavaScript中数据共享和数据传递
2016/04/25 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
2018/07/31 NodeJs
Bootstrap-table使用footerFormatter做统计列功能
2018/09/07 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
vuex存储token示例
2019/11/11 Javascript
Vue使用CDN引用项目组件,减少项目体积的步骤
2020/10/30 Javascript
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
2016/04/20 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
2019/05/13 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
python的mysql数据库建立表与插入数据操作示例
2019/09/30 Python
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
经典优秀个人求职自荐信格式
2013/09/25 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
工人先进事迹材料
2014/12/26 职场文书
教代会闭幕词
2015/01/28 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
详解Redis基本命令与使用场景
2021/06/01 Redis