算法学起来真费劲啊,智商只够捉只鸡的。昨晚没看明白就没电了,过两天要考虑偷电了...

今天看看快速排序,有一个博客写的很好,通俗生动形象,适合我这样的算法大白菜。推荐一下 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实现(三) 快速排序的更多相关文章

  1. SM3杂凑算法Python语言实现——第三部分

    SM3杂凑算法实现--第三部分 一.SM3 密码概述        我们首先把需要用到的算法呈现出来,最后我们再考虑如何集合为一个库的方法,这一部分我们就开始编写一个新的算法:国家商用密码标准SM3密 ...

  2. Python 算法(1) 快速排序

    快速排序(quickSort) 快排的思想:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序. 百度百 ...

  3. 算法 排序lowB三人组 冒泡排序 选择排序 插入排序

    参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一 ...

  4. 数据结构与算法-Python/C(目录)

    第一篇 基本概念 01 什么是数据结构 02 什么是算法 03 应用实例-最大子列和问题 第二篇 线性结构 01 线性表及其实现 02 堆栈 03 队列 04 应用实例-多项式加法运算 05 小白专场 ...

  5. 排序算法 python实现

    一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两 ...

  6. pageRank算法 python实现

    一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...

  7. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  8. Python第三天 序列 5种数据类型 数值 字符串 列表 元组 字典 各种数据类型的的xx重写xx表达式

    Python第三天 序列  5种数据类型  数值  字符串  列表  元组  字典 各种数据类型的的xx重写xx表达式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell ...

  9. kmp算法python实现

    kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...

随机推荐

  1. unsigned int 转 RGB

    unsigned int颜色存储格式:0xaabbggrr,其中a,b,g,r分别表示,透明度.蓝色.绿色.红色. 方法一:使用windows宏 unsigned int clr = 0x00FF00 ...

  2. 在.NET 应用程序设计中如何选择Class, Abstract Class and Interface

    关键字: Type– 类型 Class - 类 Abstract - 抽象的 Interface - 接口 Member - 成员 Method - 方法 Property - 属性 预备知识:在阅读 ...

  3. 网络安全设备Bypass功能介绍及分析

    from:http://netsecurity.51cto.com/art/200910/159948.htm 网络安全平台厂商往往需要用到一项比较特殊的技术,那就是Bypass,那么到底什么是Byp ...

  4. [C#]async/Await 使用小计

    如果指定使用 异步 或 异步 修饰符,方法是异步方法,可以实现以下两个函数.  • 清单异步方法可以使用 Await 或指定的 等待 悬挂点.  等待运算符通知编译器异步方法不能继续点的过去,直到等待 ...

  5. JavaScript获取非行间样式/定义样式

    html节点的样式分为以下几种 (1)浏览器默认样式 (2)引用样式(引用外部css文件的样式.style标签内定义的样式) 引用外部css样式:<link rel="styleshe ...

  6. 微信公众号-加解密数据demo坑

    demo里面的MsgSignature作为url参数一部分了,demo也不更新下 坑爹的微信! 解密信息部分 include_once "wxBizMsgCrypt.php"; $ ...

  7. 使用Yii框架中遇到的三个问题

    以下由我们在信易网络公司开发项目的时候终结出的一些经验 使用Yii框架中遇到的三个问题 1.main.php文件中欲引入全局变量的问题 还原一下此问题:在Yii框架中,main.php一般会作为整个应 ...

  8. python学习_数据处理编程实例(二)

    在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...

  9. Vue.js 2.0 和 React、Augular

    Vue.js 2.0 和 React.Augular 引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那 ...

  10. swift 与 OC 混合编程

    原文地址:http://www.cocoachina.com/swift/20150608/12025.html 一.解决问题 Swift项目需要使用封装好的Objective-c组件.第三方类库,苹 ...