快速排序的算法思想及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实现Windows定时关机功能
Mar 21 Python
Python 实现随机数详解及实例代码
Apr 15 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
Sanic框架异常处理与中间件操作实例分析
Jul 16 Python
Python模拟简单电梯调度算法示例
Aug 20 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 Python
elasticsearch python 查询的两种方法
Aug 04 Python
python matplotlib库绘制散点图例题解析
Aug 10 Python
Python 私有化操作实例分析
Nov 21 Python
Selenium 配置启动项参数的方法
Dec 04 Python
python小程序之飘落的银杏
Apr 17 Python
Django框架模板用法详解
Jun 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
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
php多文件打包下载的实例代码
2017/07/12 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
jQuery+PHP打造滑动开关效果
2014/12/16 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
Python实现的简单dns查询功能示例
2017/05/24 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
Python处理PDF与CDF实例
2020/02/26 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
学校课外活动总结
2014/05/08 职场文书
投资建议书模板
2014/05/12 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
党员个人整改措施
2014/10/24 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers