快速排序的四种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实现设置windows桌面壁纸代码分享
Mar 28 Python
Python md5与sha1加密算法用法分析
Jul 14 Python
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
对python 通过ssh访问数据库的实例详解
Feb 19 Python
Python零基础入门学习之输入与输出
Apr 03 Python
python实现QQ批量登录功能
Jun 19 Python
Django 开发环境配置过程详解
Jul 18 Python
django之导入并执行自定义的函数模块图解
Apr 01 Python
解决Jupyter NoteBook输出的图表太小看不清问题
Apr 16 Python
解决python执行较大excel文件openpyxl慢问题
May 15 Python
Pytorch上下采样函数--interpolate用法
Jul 07 Python
Python中qutip用法示例详解
Oct 02 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模拟HTTP认证
2006/10/09 PHP
PHP聊天室技术
2006/10/09 PHP
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
javascript中的继承实例代码
2011/04/27 Javascript
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
JS Select下拉框(支持输入模糊查询)
2017/02/04 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
关于JS与jQuery中的文档加载问题
2017/08/22 jQuery
Python open读写文件实现脚本
2008/09/06 Python
Python中条件判断语句的简单使用方法
2015/08/21 Python
Python中的Descriptor描述符学习教程
2016/06/02 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
2019/04/26 Python
医学院学生的自我评价分享
2013/11/19 职场文书
药学专业大专生的自我评价
2013/12/12 职场文书
自动化专业职业生涯规划书范文
2014/01/16 职场文书
校运会口号
2014/06/18 职场文书
争先创优演讲稿
2014/09/15 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
2015年计划生育协会工作总结
2015/05/13 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
2016年百日安全生产活动总结
2016/04/06 职场文书
诚信高考倡议书
2019/06/24 职场文书
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
win10清理dns缓存
2022/04/19 数码科技
Win11查看设备管理器
2022/04/19 数码科技
使用CSS实现黑白格背景效果
2022/06/01 HTML / CSS