快速排序的算法思想及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实现百度关键词排名查询
Mar 30 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
解析Python中的eval()、exec()及其相关函数
Dec 20 Python
利用Python如何生成hash值示例详解
Dec 20 Python
在python3.5中使用OpenCV的实例讲解
Apr 02 Python
解决phantomjs截图失败,phantom.exit位置的问题
May 17 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 Python
Django shell调试models输出的SQL语句方法
Aug 29 Python
Python闭包装饰器使用方法汇总
Jun 29 Python
python实现图片转字符画
Feb 19 Python
windows安装python超详细图文教程
May 21 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
傻瓜化配置PHP环境――Appserv
2006/12/13 PHP
php foreach 参数强制类型转换的问题
2010/12/10 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
jquery win 7透明弹出层效果的简单代码
2013/08/06 Javascript
jQuery中parents()方法用法实例
2015/01/07 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
JavaScript字符串检索字符的方法
2017/06/23 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
Eclipse + Python 的安装与配置流程
2013/03/05 Python
python实现梯度下降算法
2020/03/24 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
Python中遍历列表的方法总结
2019/06/27 Python
python使用递归的方式建立二叉树
2019/07/03 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
django如何自己创建一个中间件
2019/07/24 Python
pytorch 常用线性函数详解
2020/01/15 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
css3 iphone玻璃透明气泡完美实现
2013/03/20 HTML / CSS
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
升职自荐信范文
2013/10/05 职场文书
2014年元旦感言
2014/03/06 职场文书
公务员培的训心得体会
2014/09/01 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
2014年妇女工作总结
2014/12/06 职场文书
个园导游词
2015/02/04 职场文书
PHP新手指南
2021/04/01 PHP