快速排序的算法思想及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中使用HTMLParser解析HTML的教程
Apr 29 Python
Python使用正则表达式实现文本替换的方法
Apr 18 Python
详解用Python处理HTML转义字符的5种方式
Dec 27 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
Apr 02 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
Python 如何展开嵌套的序列
Aug 01 Python
Python通用唯一标识符uuid模块使用案例
Sep 10 Python
弄清Pytorch显存的分配机制
Dec 10 Python
Python列表元素删除和remove()方法详解
Jan 04 Python
Python实现将多张图片合成MP4视频并加入背景音乐
Apr 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 过滤页面中的BOM(实现代码)
2013/06/29 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
Linux php 中文乱码的快速解决方法
2016/05/13 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
JS中操作JSON总结
2020/12/06 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
bootstrap自定义样式之bootstrap实现侧边导航栏功能
2018/09/10 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
使用Python编写提取日志中的中文的脚本的方法
2015/04/30 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
Python面向对象程序设计示例小结
2019/01/30 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
python序列类型种类详解
2020/02/26 Python
python对一个数向上取整的实例方法
2020/06/18 Python
什么是数组名
2012/05/10 面试题
医院护士求职自荐信格式
2013/09/21 职场文书
简历自荐信
2013/12/02 职场文书
社区庆八一活动方案
2014/02/02 职场文书
绩效工资实施方案
2014/03/15 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
机关作风建设心得体会
2014/10/22 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
MySQL查询日期时间
2022/05/15 MySQL