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 Web框架Flask信号机制(signals)介绍
Jan 01 Python
python清除字符串里非数字字符的方法
Jul 02 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
Jan 23 Python
python实现守护进程、守护线程、守护非守护并行
May 05 Python
django将数组传递给前台模板的方法
Aug 06 Python
Python多线程模块Threading用法示例小结
Nov 09 Python
Python数据可视化:顶级绘图库plotly详解
Dec 07 Python
Python包,__init__.py功能与用法分析
Jan 07 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 Python
python 批量将中文名转换为拼音
Feb 07 Python
Python控制台输出俄罗斯方块移动和旋转功能
Apr 18 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开发框架的对比
2013/07/05 PHP
详解php中反射的应用
2016/03/15 PHP
基于PHP实现短信验证码接口(容联运通讯)
2016/09/06 PHP
js tab 选项卡
2009/04/26 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
javascript arguments使用示例
2014/12/16 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
Ajax的概述与实现过程
2016/11/18 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
vue 实现通过手机发送短信验证码注册功能
2018/04/19 Javascript
linux 下以二进制的方式安装 nodejs
2020/02/12 NodeJs
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
Python RuntimeError: thread.__init__() not called解决方法
2015/04/28 Python
Python实现控制台输入密码的方法
2015/05/29 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
django 类视图的使用方法详解
2019/07/24 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
奥地利汽车配件店:Pkwteile.at
2017/03/10 全球购物
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
百年校庆节目主持词
2014/03/27 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书
警示教育观后感
2015/06/17 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js