算法 python实现(三) 快速排序
算法学起来真费劲啊,智商只够捉只鸡的。昨晚没看明白就没电了,过两天要考虑偷电了...
今天看看快速排序,有一个博客写的很好,通俗生动形象,适合我这样的算法大白菜。推荐一下 http://www.cnblogs.com/morewindows/category/314533.html
里面的快排的形象比喻特别到位,我就借花献佛了。
大体情况是这样的:
1. 拿一个数作为基准数(我一般都是拿第一个数,就是a[0]),比这个数小的都放在他的左边,比这个数大的都放在他的右边。这样就分出来了两个小序列。
2. 然后在分出来的两个小数列中再分别进行这样的操作,直到小序列只剩一个数。
下面看看具体怎么做:
这里有一堆数 a = [1,3,4,2,5,0]
1. 首先拿到 x = a[0] 作为基准数,两个指针left,right 分别指向数列的头和尾。把这个基准数挖出来,那现在a[0]这个位置就是一个坑,而且left在指向这个坑。
2. 从right开始,比较a[right] 和 x 大小,按照上面的目的,小的在左大的在右,如果a[right] <= x,那就把a[right]这个数挖出来,填到一开始那个坑里。也就是替换a[left] a[right],注意现在right的位置是一个坑。 然后让left+1,换到left开始找。那如果a[right] > x 那就不动,把right-1 往前继续找比x小的数。直到找到小于x 的数然后然后挖坑,或者当left == right的时候结束,因为left == right 说明left right指向同一个坑,然后就可以把x填进去了。这一次就完事了,分为了两个小序列。
3. 从right那边找到后换到left找。找什么,找满足a[left] > x的数,把它往后挪。道理跟right那边操作是一样的,找到之后挖出来,填进right指向的那个坑里,然后让right -1往前挪,准备下次的找数。注意a[left]被挖出去了,那left就指向了一个坑。等待下次right那边找到合适的数填进来。同样,只要left == right了,就把x填进去,然后结束。序列也就被分为了两个小序列。
有点罗嗦,代码:
#首先写挖坑的操作,挖坑操作只能处理序列成为两个小序列
#至于小序列的从排序是不能自动处理的
#所以一会还要有另一个函数来递归调用挖坑函数
#达到使每一个小序列也进行挖坑操作的目的 #指定序列a,左指针left,右指针right,左右指针表明了排序的区间
#因为在处理小序列的时候,头尾就不再是0 和 len(a)-1 了
def wakeng(a, left, right):
#这个x就是基准数,一般拿头就可以了
x = a[left]
#当left right重合时,把x填进这个坑,然后结束本次挖坑操作
while left < right:
#开始尾巴找小的往左放
#这里加了left right条件是因为当序列初始就是排好基准数右边都比他大
#right都到了left那边,都越界了,right还在自减,这可不行
while left < right and a[right] > x:
right -= 1
#同样的道理,要保证不越界
if left < right:
a[left] = a[right]
left += 1 #开始从头找大的往右放
while left < right and a[left] <= x:
left += 1
if left < right:
a[right] = a[left]
right -= 1
#把x填进 left 和 right 同时指向的这个坑
a[left] = x
#返回当前基准数的位置,作为下次小序列的边界。
return left #循环每个小序列的函数,分治
def fenzhi(a, left, right):
#同样函数结束条件就是left == right
if left < right:
#拿到位置
weizhi = wakeng(a, left, right)
#分别对两个小序列再分治挖坑
fenzhi(a,left,weizhi-1)
fenzhi(a,weizhi+1,right) a = [123,434,3,44,545,465,43,34,54,676,34,4,5,6]
fenzhi(a, 0, len(a)-1)
print a
下回见
算法 python实现(三) 快速排序的更多相关文章
- SM3杂凑算法Python语言实现——第三部分
SM3杂凑算法实现--第三部分 一.SM3 密码概述 我们首先把需要用到的算法呈现出来,最后我们再考虑如何集合为一个库的方法,这一部分我们就开始编写一个新的算法:国家商用密码标准SM3密 ...
- Python 算法(1) 快速排序
快速排序(quickSort) 快排的思想:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序. 百度百 ...
- 算法 排序lowB三人组 冒泡排序 选择排序 插入排序
参考博客:基于python的七种经典排序算法 [经典排序算法][集锦] 经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一 ...
- 数据结构与算法-Python/C(目录)
第一篇 基本概念 01 什么是数据结构 02 什么是算法 03 应用实例-最大子列和问题 第二篇 线性结构 01 线性表及其实现 02 堆栈 03 队列 04 应用实例-多项式加法运算 05 小白专场 ...
- 排序算法 python实现
一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两 ...
- pageRank算法 python实现
一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...
- 常见排序算法-Python实现
常见排序算法-Python实现 python 排序 算法 1.二分法 python 32行 right = length- : ] ): test_list = [,,,,,, ...
- Python第三天 序列 5种数据类型 数值 字符串 列表 元组 字典 各种数据类型的的xx重写xx表达式
Python第三天 序列 5种数据类型 数值 字符串 列表 元组 字典 各种数据类型的的xx重写xx表达式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell ...
- kmp算法python实现
kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...
随机推荐
- javascript 获取url参数
/** window.location.search获取url地址?以后的值 获取url参数有两种方法,第一种如下,第二种是通过正则 */ //基本版 function getParam() { va ...
- thinkphp 模板中赋值
在项目开发的时候,有时候希望直接在模板中调用 一些自定义方法,或者内置方法来,处理获得一些数据,并且赋值给一个变量给后面调用,这个时候如果用原生Php 的方式调用如下:<?php $abc = ...
- Codevs 1427 特种部队(双路DP)
1427 特种部队 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 黄金 Gold 题目描述 Description 某特种部队接到一个任务,需要潜入一个仓库.该部队士兵分为两路,第一 ...
- Make Ubuntu 14.04 Fullscreen and virtualbox
sudo apt-get remove libcheese-gtk23 sudo apt-get install xserver-xorg-core sudo apt-get install virt ...
- linux centos cli all proxy
linux centos 下代理http.https.ftp.all_proxy 全局使用代理: export http_proxy=http://host:port/ export https_pr ...
- ubuntu apt-get
近期重新拿起linux的书看了下,整理了一下linux的命令. ubuntu预装了APT和dpkg ,“APT”是 “Advanced Package Tool”的简写,“dpkg ”是“Debian ...
- CentOS系统安全配置
http://down.51cto.com/data/318797 http://www.centos.bz/2011/07/centos-system-security-configure/ htt ...
- JBPM4中常用概念总结
1. 流程定义(Process Definition) 流程定义是记录在xml文件中的对流程的描述,它包含唯一的流程开始节点和多个流程功能节点,每个节点之间使用transition进行连接. P ...
- OS概论1
1.设计现代OS的主要目标是什么? 在计算机上配置操作系统,其主要目标是:方便性,有效性,可扩充性,开放性. 一个没有OS的操作系统,就必须用机器语言书写程序,如果在计算机上配置了OS,系统便可以使用 ...
- C#中引用(ref关键字)参数
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 函数的参 ...