快速排序的四种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和shell变量互相传递的几种方法
Nov 20 Python
详解Python中__str__和__repr__方法的区别
Apr 17 Python
python使用xmlrpclib模块实现对百度google的ping功能
Jun 02 Python
使用Python绘制图表大全总结
Feb 11 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
python监控nginx端口和进程状态
Sep 06 Python
python中文分词库jieba使用方法详解
Feb 11 Python
Java爬虫技术框架之Heritrix框架详解
Jul 22 Python
Python如何读取、写入CSV数据
Jul 28 Python
Python Pivot table透视表使用方法解析
Sep 11 Python
Python调用JavaScript代码的方法
Oct 27 Python
这样写python注释让代码更加的优雅
Jun 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按行读取文件时删除换行符的3种方法
2014/05/04 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
JavaScript中双向数据绑定详解
2017/05/03 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
Python函数中定义参数的四种方式
2014/11/30 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
python学习教程之使用py2exe打包
2017/09/24 Python
python中scikit-learn机器代码实例
2018/08/05 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
简单了解Python write writelines区别
2020/02/27 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
2020/12/31 Python
皇马官方商城:Real Madrid Store
2016/09/02 全球购物
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
音乐器材管理制度
2014/01/31 职场文书
应届生求职信范文
2014/05/26 职场文书
负责人任命书范本
2014/06/04 职场文书
如何使用SQL Server语句创建表
2022/04/12 SQL Server