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 FTP操作类代码分享
May 13 Python
Python生成验证码实例
Aug 21 Python
Python常用库推荐
Dec 04 Python
Python编程判断一个正整数是否为素数的方法
Apr 14 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
python算法与数据结构之冒泡排序实例详解
Jun 22 Python
PyCharm2018 安装及破解方法实现步骤
Sep 09 Python
TensorFlow查看输入节点和输出节点名称方式
Jan 04 Python
python生成并处理uuid的实现方式
Mar 03 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
基于python实现复制文件并重命名
Sep 16 Python
基于PyQt5制作一个群发邮件工具
Apr 08 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 神盾解密
2014/06/08 PHP
ecshop实现smtp发送邮件
2015/02/03 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
php实现留言板功能(会话控制)
2017/05/23 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
javascript 播放器 控制
2007/01/22 Javascript
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
javascript 获取模态窗口的滚动位置代码
2013/08/06 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
2018/05/16 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
[01:04:02]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第二场 1月24日
2021/03/11 DOTA
Python入门必须知道的11个知识点
2018/03/21 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
Django实现文件上传下载
2019/10/06 Python
python如何更新包
2020/06/11 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
CSS3解析抖音LOGO制作的方法步骤
2019/04/11 HTML / CSS
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
英国时尚高尔夫服装购物网站:Trendy Golf
2020/01/10 全球购物
中药专业自荐信范文
2014/03/18 职场文书
学校教研活动总结
2014/07/02 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
先进人物事迹材料
2014/12/29 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书