快速排序的算法思想及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入门指引
Apr 01 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
梯度下降法介绍及利用Python实现的方法示例
Jul 12 Python
详解Django-restframework 之频率源码分析
Feb 27 Python
PyQt5 在label显示的图片中绘制矩形的方法
Jun 17 Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 Python
如何利用pygame实现简单的五子棋游戏
Dec 29 Python
flask 框架操作MySQL数据库简单示例
Feb 02 Python
浅析matlab中imadjust函数
Feb 27 Python
pip安装tensorflow的坑的解决
Apr 19 Python
python链表类中获取元素实例方法
Feb 23 Python
python+opencv实现视频抽帧示例代码
Jun 11 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浮点数精度问题汇总
2015/05/13 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
JS 进度条效果实现代码整理
2011/05/21 Javascript
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
Vue计算属性的学习笔记
2017/03/22 Javascript
vue中SPA单页面应用程序详解
2017/11/07 Javascript
jQuery实现form表单序列化转换为json对象功能示例
2018/05/23 jQuery
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
node.js文件操作系统实例详解
2019/11/05 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
python实现下载指定网址所有图片的方法
2015/08/08 Python
Windows下为Python安装Matplotlib模块
2015/11/06 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
Django命名URL和反向解析URL实现解析
2019/08/09 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
Python selenium如何打包静态网页并下载
2020/08/12 Python
python实现邮件循环自动发件功能
2020/09/11 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
利用python 下载bilibili视频
2020/11/13 Python
CSS3实现圆角、阴影、透明效果并兼容各大浏览器
2014/08/08 HTML / CSS
Mistine官方海外旗舰店:泰国国民彩妆品牌
2016/12/28 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
医学院四年学习生活的自我评价
2013/11/06 职场文书
中层干部竞争上岗演讲稿
2014/01/13 职场文书
工作说明书格式
2014/07/29 职场文书
军训阅兵新闻稿
2015/07/17 职场文书