快速排序的四种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 相关文章推荐
Python2.x中str与unicode相关问题的解决方法
Mar 30 Python
python删除特定文件的方法
Jul 30 Python
Python 探针的实现原理
Apr 23 Python
用Python一键搭建Http服务器的方法
Jun 01 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
Jul 04 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
Jun 13 Python
python实现按行分割文件
Jul 22 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
python2 对excel表格操作完整示例
Feb 23 Python
python批量修改xml属性的实现方式
Mar 05 Python
python json.dumps() json.dump()的区别详解
Jul 14 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
Mysql的常用命令
2006/10/09 PHP
PHP 遍历文件实现代码
2011/05/04 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
PHP API接口必备之输出json格式数据示例代码
2017/06/27 PHP
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
javascript delete 使用示例代码
2010/03/29 Javascript
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
JSON 和 JavaScript eval使用说明
2010/06/13 Javascript
ajax 缓存 问题 requestheader
2010/08/01 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
2017/04/26 jQuery
Vue中 key keep-alive的实现原理
2018/09/18 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
详解Python中的循环语句的用法
2015/04/09 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
2021/02/19 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
大专学生推荐信范文
2013/11/19 职场文书
团队精神的演讲稿
2014/05/14 职场文书
党员作风建设整改方案
2014/10/27 职场文书
财产分割协议书范本
2014/11/03 职场文书
欠款起诉书范文
2015/05/19 职场文书
先进个人主要事迹范文
2015/11/04 职场文书
五年级作文之成长
2019/09/16 职场文书
导游词之贵州织金洞
2019/10/12 职场文书