Python实现的数据结构与算法之快速排序详解


Posted in Python onApril 22, 2015

本文实例讲述了Python实现的数据结构与算法之快速排序。分享给大家供大家参考。具体分析如下:

一、概述

快速排序(quick sort)是一种分治排序算法。该算法首先 选取 一个划分元素(partition element,有时又称为pivot);接着重排列表将其 划分 为三个部分:left(小于划分元素pivot的部分)、划分元素pivot、right(大于划分元素pivot的部分),此时,划分元素pivot已经在列表的最终位置上;然后分别对left和right两个部分进行 递归排序

其中,划分元素的 选取 直接影响到快速排序算法的效率,通常选择列表的第一个元素或者中间元素或者最后一个元素作为划分元素,当然也有更复杂的选择方式;划分 过程根据划分元素重排列表,是快速排序算法的关键所在,该过程的原理示意图如下:

<-- 选取划分元素 -->

Python实现的数据结构与算法之快速排序详解

<-- 划分过程 -->

Python实现的数据结构与算法之快速排序详解

<-- 划分结果 -->

Python实现的数据结构与算法之快速排序详解

快速排序算法的优点是:原位排序(只使用很小的辅助栈),平均情况下的时间复杂度为 O(n log n)。快速排序算法的缺点是:它是不稳定的排序算法,最坏情况下的时间复杂度为 O(n2)。

二、Python实现

1、标准实现

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def stdQuicksort(L):
  qsort(L, 0, len(L) - 1)
def qsort(L, first, last):
  if first < last:
    split = partition(L, first, last)
    qsort(L, first, split - 1)
    qsort(L, split + 1, last)
def partition(L, first, last):
  # 选取列表中的第一个元素作为划分元素
  pivot = L[first]
  leftmark = first + 1
  rightmark = last
  while True:
    while L[leftmark] <= pivot: 
 # 如果列表中存在与划分元素pivot相等的元素,让它位于left部分
     # 以下检测用于划分元素pivot是列表中的最大元素时,
  #防止leftmark越界
      if leftmark == rightmark:
        break
      leftmark += 1
    while L[rightmark] > pivot:
      # 这里不需要检测,划分元素pivot是列表中的最小元素时,
      # rightmark会自动停在first处
      rightmark -= 1
    if leftmark < rightmark:
      # 此时,leftmark处的元素大于pivot,
   #而rightmark处的元素小于等于pivot,交换二者
      L[leftmark], L[rightmark] = L[rightmark], L[leftmark]
    else:
      break
  # 交换first处的划分元素与rightmark处的元素
  L[first], L[rightmark] = L[rightmark], L[first]
  # 返回划分元素pivot的最终位置
  return rightmark

2、Pythonic实现

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def pycQuicksort(L):
  if len(L) <= 1: return L
  return pycQuicksort([x for x in L if x < L[0]]) + \
      [x for x in L if x == L[0]] + \
      pycQuicksort([x for x in L if x > L[0]])

对比 标准实现 可以看出,Pythonic实现 更简洁、更直观、更酷。但需要指出的是,Pythonic实现 使用了Python中的 列表解析 (List Comprehension,也叫列表展开、列表推导),每一次 递归排序 都会产生新的列表,因此失去了快速排序算法本来的 原位排序 的优点。

三、算法测试

#!/usr/bin/env python
# -*- coding: utf-8 -*-
if __name__ == '__main__':
  L = [54, 26, 93, 17, 77, 31, 44, 55, 20]
  M = L[:]
  print('before stdQuicksort: ' + str(L))
  stdQuicksort(L)
  print('after stdQuicksort: ' + str(L))
  print('before pycQuicksort: ' + str(M))
  print('after pycQuicksort: ' + str(pycQuicksort(M)))

运行结果:

$ python testquicksort.py
before stdQuicksort: [54, 26, 93, 17, 77, 31, 44, 55, 20]
after stdQuicksort: [17, 20, 26, 31, 44, 54, 55, 77, 93]
before pycQuicksort: [54, 26, 93, 17, 77, 31, 44, 55, 20]
after pycQuicksort: [17, 20, 26, 31, 44, 54, 55, 77, 93]

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python实现将文本转换成语音的方法
May 28 Python
老生常谈Python进阶之装饰器
May 11 Python
Python实现运行其他程序的四种方式实例分析
Aug 17 Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 Python
python批量替换页眉页脚实例代码
Jan 22 Python
浅谈python中真正关闭socket的方法
Dec 18 Python
在Python中获取操作系统的进程信息
Aug 27 Python
关于Flask项目无法使用公网IP访问的解决方式
Nov 19 Python
python实现二分类的卡方分箱示例
Nov 22 Python
python3爬取torrent种子链接实例
Jan 16 Python
python各种excel写入方式的速度对比
Nov 10 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 19 Python
利用Fn.py库在Python中进行函数式编程
Apr 22 #Python
Python实现的数据结构与算法之基本搜索详解
Apr 22 #Python
Python实现的数据结构与算法之链表详解
Apr 22 #Python
Python实现的数据结构与算法之双端队列详解
Apr 22 #Python
Python实现的数据结构与算法之队列详解
Apr 22 #Python
详尽讲述用Python的Django框架测试驱动开发的教程
Apr 22 #Python
Hadoop中的Python框架的使用指南
Apr 22 #Python
You might like
PHP程序员编程注意事项
2008/04/10 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
2015/04/29 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
2016/07/27 Javascript
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
python 七种邮件内容发送方法实例
2014/04/22 Python
详解python3实现的web端json通信协议
2016/12/29 Python
python爬取网页转换为PDF文件
2018/06/07 Python
python实现字符串加密 生成唯一固定长度字符串
2019/03/22 Python
python打开windows应用程序的实例
2019/06/28 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
基于Python实现体育彩票选号器功能代码实例
2020/09/16 Python
Python 创建守护进程的示例
2020/09/29 Python
numpy实现RNN原理实现
2021/03/02 Python
泰国演唱会订票网站:StubHub泰国
2018/02/26 全球购物
JavaScript实现页面动态验证码的实现示例
2021/03/23 Javascript
成教自我鉴定
2013/10/27 职场文书
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
综合实践活动方案
2014/02/14 职场文书
单位工程竣工验收方案
2014/03/16 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书
人民币符号
2022/02/17 杂记
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python