快速排序的算法思想及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函数参数*args**kwargs用法实例
Dec 04 Python
处理Python中的URLError异常的方法
Apr 30 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
Jun 21 Python
基于Python Shell获取hostname和fqdn释疑
Jan 25 Python
Python部署web开发程序的几种方法
May 05 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
Nov 21 Python
pandas DataFrame数据转为list的方法
Apr 11 Python
浅析Python 中几种字符串格式化方法及其比较
Jul 02 Python
远程部署工具Fabric详解(支持Python3)
Jul 04 Python
8段用于数据清洗Python代码(小结)
Oct 31 Python
Python简单实现区域生长方式
Jan 16 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
Mar 10 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 UTF-8、Unicode和BOM问题
2010/05/18 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
FireFox JavaScript全局Event对象
2009/06/14 Javascript
文本框输入时 实现自动提示(像百度、google一样)
2012/04/05 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
怎么引入(调用)一个JS文件
2016/05/26 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
vue插件实现v-model功能
2018/09/10 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
[02:44]DOTA2英雄基础教程 钢背兽
2013/12/19 DOTA
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
cmd运行python文件时对结果进行保存的方法
2018/05/16 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
Python WEB应用部署的实现方法
2019/01/02 Python
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
Python 创建守护进程的示例
2020/09/29 Python
利用Python发送邮件或发带附件的邮件
2020/11/12 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
html5标记文字_动力节点Java学院整理
2017/07/11 HTML / CSS
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
ASOS西班牙官网:英国在线时尚和美容零售商
2020/01/10 全球购物
物业管理应届生求职信
2013/10/28 职场文书
体育教师个人的自我评价
2014/02/16 职场文书
经典团队口号
2014/06/06 职场文书
校园活动策划方案
2014/06/13 职场文书
Java对文件的读写操作方法
2022/04/29 Java/Android