快速排序的四种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系列之数据处理编程实例(一)
May 22 Python
Python Learning 列表的更多操作及示例代码
Aug 22 Python
python使用多进程的实例详解
Sep 19 Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 Python
Python使用Turtle库绘制一棵西兰花
Nov 23 Python
Win10里python3创建虚拟环境的步骤
Jan 31 Python
深入浅析python的第三方库pandas
Feb 13 Python
使用TFRecord存取多个数据案例
Feb 17 Python
python实例化对象的具体方法
Jun 17 Python
Python+Appium实现自动化清理微信僵尸好友的方法
Feb 04 Python
Python数据分析入门之教你怎么搭建环境
May 13 Python
Python编程源码报错解决方法总结经验分享
Oct 05 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版(3)
2006/10/09 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
angularjs实现天气预报功能
2020/06/16 Javascript
jquery学习笔记之无new构建详解
2017/12/07 jQuery
对Angular中单向数据流的深入理解
2018/03/31 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
python读取注册表中值的方法
2013/04/08 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
Pycharm编辑器技巧之自动导入模块详解
2017/07/18 Python
利用python如何处理nc数据详解
2018/05/23 Python
Python 实现交换矩阵的行示例
2019/06/26 Python
Python pandas如何向excel添加数据
2020/05/22 Python
python 瀑布线指标编写实例
2020/06/03 Python
Keras实现DenseNet结构操作
2020/07/06 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
印度在线杂货店:bigbasket
2018/08/23 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
精伦电子Java笔试题
2013/01/16 面试题
描述JSP和Servlet的区别、共同点、各自应用的范围
2012/10/02 面试题
建筑学推荐信
2013/11/03 职场文书
麦当劳辞职信范文
2014/01/18 职场文书
会计专业求职信范文
2014/03/16 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
Java使用JMeter进行高并发测试
2021/11/23 Java/Android
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python
Golang入门之计时器
2022/05/04 Golang