快速排序的算法思想及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 相关文章推荐
在Linux命令行终端中使用python的简单方法(推荐)
Jan 23 Python
Python实现获取本地及远程图片大小的方法示例
Jul 21 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
Sep 03 Python
python区块及区块链的开发详解
Jul 03 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
Jul 11 Python
python爬虫 urllib模块发起post请求过程解析
Aug 20 Python
python+django+rest框架配置创建方法
Aug 31 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 Python
python和php哪个容易学
Jun 19 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 Python
Python scrapy爬取起点中文网小说榜单
Jun 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中养成7个面向对象的好习惯
2010/07/17 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
Laravel日志用法详解
2016/10/09 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
thinkPHP框架整合tcpdf插件操作示例
2018/08/07 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
改变checkbox默认选中状态及取值的实现代码
2016/05/26 Javascript
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
python制作小说爬虫实录
2017/08/14 Python
Python自定义线程池实现方法分析
2018/02/07 Python
Python网络编程之TCP套接字简单用法示例
2018/04/09 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
2019/08/09 Python
pytorch中的transforms模块实例详解
2019/12/31 Python
python实现井字棋小游戏
2020/03/04 Python
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
日本整理专家Marie Kondo的官方在线商店:KonMari
2020/06/29 全球购物
大学生志愿者感言
2014/01/15 职场文书
弘扬民族精神演讲稿
2014/05/07 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
学习十八大演讲稿
2014/09/15 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
超市员工管理制度
2015/08/06 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python