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实现多线程采集的2个代码例子
Jul 07 Python
Python计算回文数的方法
Mar 11 Python
Python中文件I/O高效操作处理的技巧分享
Feb 04 Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 Python
ubuntu环境下python虚拟环境的安装过程
Jan 07 Python
Django数据库表反向生成实例解析
Feb 06 Python
Python获取系统所有进程PID及进程名称的方法示例
May 24 Python
python抓取京东小米8手机配置信息
Nov 13 Python
微信小程序python用户认证的实现
Jul 29 Python
python递归调用中的坑:打印有值, 返回却None
Mar 16 Python
Python如何输出百分比
Jul 31 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 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运行时动态创建函数的方法
2015/03/16 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
语义化 H1 标签
2008/01/14 Javascript
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
JS实现自动变换的菜单效果代码
2015/09/09 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
vue 全局环境切换问题
2019/10/27 Javascript
原生JS实现顶部导航栏显示按钮+搜索框功能
2019/12/25 Javascript
如何构建一个Vue插件并生成npm包
2020/10/26 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
[01:32:50]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第一场 1月25日
2021/03/11 DOTA
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
2015/02/04 Python
详解python3实现的web端json通信协议
2016/12/29 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
Python换行与不换行的输出实例
2020/02/19 Python
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
说一下Linux下有关用户和组管理的命令
2016/01/04 面试题
Solaris操作系统的线程机制
2015/07/28 面试题
消防安全检查制度
2014/02/04 职场文书
广告词串烧
2014/03/19 职场文书
财产公证书格式
2014/04/10 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
三人合伙协议书范本
2014/10/29 职场文书
高中班长竞选稿
2015/11/20 职场文书
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB