快速排序的算法思想及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实现BT种子和磁力链接的相互转换
Nov 09 Python
centos6.7安装python2.7.11的具体方法
Jan 16 Python
python+selenium实现登录账户后自动点击的示例
Dec 22 Python
对Python中type打开文件的方式介绍
Apr 28 Python
python实现屏保计时器的示例代码
Aug 08 Python
利用Python将数值型特征进行离散化操作的方法
Nov 06 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
May 08 Python
python3正则模块re的使用方法详解
Feb 11 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 Python
浅析pandas随机排列与随机抽样
Jan 22 Python
python3.9之你应该知道的新特性详解
Apr 29 Python
Python作用域和名称空间的详细介绍
Apr 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和ACCESS写聊天室(二)
2006/10/09 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
ThinkPHP之A方法实例讲解
2014/06/20 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
js实现的切换面板实例代码
2013/06/17 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
jQuery实现鼠标滑过点击事件音效试听
2015/08/31 Javascript
Three.js学习之几何形状
2016/08/01 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
vue中component组件的props使用详解
2017/09/04 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
实例讲解python函数式编程
2014/06/09 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
基于Python闭包及其作用域详解
2017/08/28 Python
浅析Python数据处理
2018/05/02 Python
python tkinter基本属性详解
2019/09/16 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
PHP开发的一般流程
2013/08/13 面试题
国际经济贸易专业推荐信
2013/11/06 职场文书
自查自纠整改报告
2014/11/06 职场文书
师德承诺书2015
2015/04/28 职场文书
学校财务管理制度
2015/08/04 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python