快速排序的算法思想及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 20 Python
浅谈numpy生成数组的零值问题
Nov 12 Python
python判断文件是否存在,不存在就创建一个的实例
Feb 18 Python
Python基于mysql实现学生管理系统
Feb 21 Python
Python3.5实现的三级菜单功能示例
Mar 25 Python
python 含子图的gif生成时内存溢出的方法
Jul 07 Python
python redis 批量设置过期key过程解析
Nov 26 Python
Pycharm debug调试时带参数过程解析
Feb 03 Python
python如何快速拼接字符串
Oct 28 Python
Python将list元素转存为CSV文件的实现
Nov 16 Python
使用gunicorn部署django项目的问题
Dec 30 Python
Python数据分析入门之教你怎么搭建环境
May 13 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学习笔记之二
2011/01/17 PHP
url decode problem 解决方法
2011/12/26 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
php实现记事本案例
2020/10/20 PHP
Jquery插件之多图片异步上传
2010/10/20 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
javascript确认框的三种使用方法
2013/12/17 Javascript
jQuery中clone()方法用法实例
2015/01/16 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
js实现带圆角的多级下拉菜单效果
2015/08/28 Javascript
js图片轮播效果实现代码
2020/04/18 Javascript
js倒计时抢购实例
2015/12/20 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
[01:22:10]Ti4 循环赛第二日 DK vs Empire
2014/07/11 DOTA
[45:18]完美世界DOTA2联赛循环赛 PXG vs IO 第二场 11.06
2020/11/09 DOTA
简单介绍Python中的JSON模块
2015/04/08 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
python实现烟花小程序
2019/01/30 Python
详解python中的time和datetime的常用方法
2019/07/08 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
环境工程专业个人求职信
2013/12/05 职场文书
网络技术专业求职信
2014/02/18 职场文书
卖车协议书范例
2014/09/16 职场文书
培训计划通知
2015/07/15 职场文书
Python中的pprint模块
2021/11/27 Python
业余无线电通联Q语
2022/02/18 无线电