快速排序的算法思想及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中字符串前面加r的作用
Jun 04 Python
pandas对指定列进行填充的方法
Apr 11 Python
python存储16bit和32bit图像的实例
Dec 05 Python
python+os根据文件名自动生成文本
Mar 21 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
Python搭建代理IP池实现存储IP的方法
Oct 27 Python
python中的RSA加密与解密实例解析
Nov 18 Python
python 类之间的参数传递方式
Dec 20 Python
python列表删除和多重循环退出原理详解
Mar 26 Python
pyspark 随机森林的实现
Apr 24 Python
python如何设置静态变量
Sep 07 Python
记录一下scrapy中settings的一些配置小结
Sep 28 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载入页面时编码的方法
2014/07/29 PHP
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
javascript 二维数组的实现与应用
2010/03/16 Javascript
javascript学习笔记(十三) js闭包介绍(转)
2012/06/20 Javascript
js 图片随机不定向浮动的实现代码
2013/07/02 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
jquery性能优化高级技巧
2015/08/24 Javascript
node网页分段渲染详解
2016/09/05 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
微信小程序侧边栏滑动特效(左右滑动)
2017/01/23 Javascript
canvas实现动态小球重叠效果
2017/02/06 Javascript
js canvas实现擦除效果示例代码
2017/04/26 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
vue单页开发父子组件传值思路详解
2018/05/18 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
vue学习笔记之作用域插槽实例分析
2020/02/01 Javascript
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
Python中import机制详解
2017/11/14 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
2020/05/12 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
电子狗项圈:eDog Australia
2019/12/04 全球购物
财务管理专业推荐信
2013/11/19 职场文书
销售行政专员职责
2014/01/03 职场文书
企业出纳岗位职责
2014/03/12 职场文书
爱国口号
2014/06/19 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
费城故事观后感
2015/06/10 职场文书
学校远程教育工作总结
2015/08/11 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js