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

今天看看快速排序,有一个博客写的很好,通俗生动形象,适合我这样的算法大白菜。推荐一下 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. phaser源码解析(一) Phaser.Utils类下shuffle方法

    /** * #一个 基于 费雪耶茨排列 洗牌方法 * A standard Fisher-Yates Array shuffle implementation. * @method Phaser.Ut ...

  2. QListWidget 删除选中项目

    void MainWindow::on_action_Del_triggered() { QList<QListWidgetItem*> selectedItems = ui->li ...

  3. 九度OJ 1113 二叉树

    题目地址:http://ac.jobdu.com/problem.php?pid=1113 题目描述: 如上所示,由正整数1,2,3……组成了一颗特殊二叉树.我们已知这个二叉树的最后一个结点是n.现在 ...

  4. 简易的RestClient代码

    package tests; import java.io.*; import org.apache.http.HttpEntity; import org.apache.http.HttpRespo ...

  5. 跨线程操作UI控件

    写程序的时候经常会遇到跨线程访问控件的问题,看到不少人去设置Control.CheckForIllegalCrossThreadCalls = false;这句话是告诉编译器不要对跨线程访问作检查,可 ...

  6. C# 中的委托和事件 转张子阳

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  7. 旧版Xcode下载地址

    怕忘记了,做个记号 https://developer.apple.com/downloads/

  8. hibernate配置文件详细解释

    <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' ...

  9. 【转】ant命令总结

    http://feiyeguohai.iteye.com/blog/1295922 ant命令总结 1 Ant是什么?  Apache Ant 是一个基于 Java的生成工具. 生成工具在软件开发中用 ...

  10. html 各个标签初始化

    html,body,div,ul,li,ol,h1,h2,h3,h4,h5,h6,span,input{  margin:0;padding:0;}body{font:12px/1.5em " ...