快速排序的算法思想及Python版快速排序的实现示例


Posted in Python onJuly 02, 2016

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

1.分治法的基本思想

分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

2.快速排序的基本思想

设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:

(1)分解:

在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。

注意:

划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为(注意pivot=R[pivotpos]):

R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys

其中low≤pivotpos≤high。

(2)求解:

通过递归调用快速排序对左、右子区间R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。

(3)组合:

因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作。

Python实现

原理: 先用初始数据, 然后对这个数据进行排序使左边的数据小于
该数据,右边的大于该数据,然后用递归的方法对两边的数据进行依次排序。

#!/usr/bin/env python
#_*_coding:utf-8_*_ 

def rand(x):
 import random
 if x < 3:
  x = 5
 if x > 1000:
  print "big data"
  return []
 l = range(1, x)
 li = []
 while l:
  r = random.randint(0, len(l)-1)
  li.append(l.pop(r))
 return li

def quicksort(l, low, hight):
 key = l[low]
 while low < hight:
  while key <= l[hight] and low < hight:
   hight -= 1
  l[low], l[hight] = l[hight], l[low]

  while key >= l[low] and low < hight:
   low += 1
  l[low], l[hight] = l[hight], l[low]

 l[hight] = key
 return hight

def m_sort(l, low, hight):
 if low >= hgiht:
  return 

 index = quicksort(l, low, hight)
 m_sort(l, low, index)
 m_sort(l, index+1, hight)

def main():
 l = rand(1500)
 m_sort(l, 0, len(l)-1)
 print l

if __name__ == '__main__':
 main()
Python 相关文章推荐
Python实现设置windows桌面壁纸代码分享
Mar 28 Python
Python中使用PDB库调试程序
Apr 05 Python
Python实现股市信息下载的方法
Jun 15 Python
理解Python中的With语句
Mar 18 Python
Python基于递归实现电话号码映射功能示例
Apr 13 Python
Python读取txt某几列绘图的方法
Oct 14 Python
python并发和异步编程实例
Nov 15 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
keras模型保存为tensorflow的二进制模型方式
May 25 Python
Keras预训练的ImageNet模型实现分类操作
Jul 07 Python
python 三边测量定位的实现代码
Apr 22 Python
python源码剖析之PyObject详解
May 18 Python
Python使用functools模块中的partial函数生成偏函数
Jul 02 #Python
Python之父谈Python的未来形式
Jul 01 #Python
举例讲解Python的lambda语句声明匿名函数的用法
Jul 01 #Python
Python内置数据结构与操作符的练习题集锦
Jul 01 #Python
Python设置默认编码为utf8的方法
Jul 01 #Python
Python使用email模块对邮件进行编码和解码的实例教程
Jul 01 #Python
详解Python中使用base64模块来处理base64编码的方法
Jul 01 #Python
You might like
PHP 存取 MySQL 数据库的一个例子
2006/10/09 PHP
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
php设计模式之单例模式代码
2016/06/11 PHP
Mootools 1.2教程 事件处理
2009/09/15 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
2016/03/07 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
Python fileinput模块使用介绍
2014/11/30 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
python绘制直线的方法
2018/06/30 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
怎样在程序里获得一个空指针
2015/01/24 面试题
CLR与IL分别是什么含义
2016/08/23 面试题
统计岗位职责
2014/02/21 职场文书
家庭贫困证明
2014/09/23 职场文书
2015年市场部工作总结
2015/04/30 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
六年级语文教学反思
2016/03/03 职场文书
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python
Java数组详细介绍及相关工具类
2022/04/14 Java/Android