快速排序的算法思想及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基于xml parse实现解析cdatasection数据
Sep 30 Python
python中__call__内置函数用法实例
Jun 04 Python
Python中的一些陷阱与技巧小结
Jul 10 Python
Python读写txt文本文件的操作方法全解析
Jun 26 Python
python自动化之Ansible的安装教程
Jun 13 Python
python实现静态服务器
Sep 05 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 Python
Python开发之pip安装及使用方法详解
Feb 21 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
Python+PyQt5实现灭霸响指功能
May 25 Python
Python如何在循环内使用list.remove()
Jun 01 Python
Python加载数据的5种不同方式(收藏)
Nov 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 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
PHP中的事务使用实例
2015/05/26 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
php实现图片缩略图的方法
2016/03/29 PHP
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
jquery小火箭返回顶部代码分享
2015/08/19 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
基于Node的React图片上传组件实现实例代码
2017/05/10 Javascript
canvas实现弧形可拖动进度条效果
2017/05/11 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
python executemany的使用及注意事项
2017/03/13 Python
python万年历实现代码 含运行结果
2017/05/20 Python
python调用百度语音识别api
2018/08/30 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
树莓派安装OpenCV3完整过程的实现
2019/10/10 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
Python页面加载的等待方式总结
2021/02/28 Python
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
大学生学习自我评价
2014/01/13 职场文书
运动会演讲稿300字
2014/08/25 职场文书
体育专业大学生职业生涯规划范文:打造自己的运动帝国
2014/09/12 职场文书
2015夏季作息时间调整通知
2015/04/24 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
导游词之江西赣州
2019/10/15 职场文书
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python