python数据结构与算法——快速排序
快速排序通过不断将数列分段,使得较小的数在左边的序列,较大的数在右边的序列,不断重复此过程实现排序效果。通过设置两个哨兵不断的找两个序列的较小数,较大数,并把左右的数据互换,实现对数据从粗到细的排序。
算法如下:
快速排序排序 从大到小
1. 先让从最右边的哨兵开始出发往左移动,直到找到一个小于 A[base] 的数,或者碰到左边的哨兵
2. 再从最左边的哨兵开始出发往右移动,直到找到一个大于 A[base] 的数,或者碰到右边的哨兵
3. 如果没有相遇,这将两个哨兵所在的元素交换,使得较小的元素分到了左边,较大的元素分到了右边
4. 当两个哨兵相遇,则结束循环,把序列分成两个部分,即 低端序列(都是较小元素) 和 高端序列(都是较大元素)
5. 递归,分别对 低端序列 和 高端序列 进行同样的过程
贴代码:
def quicksort_rec(A,lft=None,rgt=None):
if lft == None or rgt == None:
lft, rgt = 0, len(A)-1
if lft >= rgt:
return
i = lft # 序列最左边的哨兵
j = rgt # 序列最右边的哨兵
base = lft # 基准数的索引
while i != j:
while A[j] >= A[base] and i < j: # 先从右往左找
j -= 1
while A[i] <= A[base] and i < j:
i += 1
if i < j: # 没有相遇:交换
A[i], A[j] = A[j], A[i]
A[base], A[i] = A[i], A[base] # 基准数归位, 索引 i 为序列正中
quicksort_rec(A, lft, i-1) # 递归处理左边序列
quicksort_rec(A, i+1, rgt) # 递归处理右边序列
很短对不对,下面是运行结果:
A = [6,1,2,7,9,3,4,2,5,10,8,1]
quicksort_rec(A)
print A >>> [1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10]
另一种更简洁的实现方式:
# 分离数列seq为低端序列和高端序列
def partition(seq):
pi, seq = seq[0], seq[1:] # 选择数列中第0个数据为基准元素
lo = [x for x in seq if x <= pi] # 选出seq中较小元素
hi = [x for x in seq if x > pi] # 选出seq中较大元素
return lo,pi,hi # 快速排序法
def quicksort(seq):
if len(seq)<=1: return seq
lo, pi, hi = partition(seq)
return quicksort(lo) + [pi] + quicksort(hi) # 测试
seq = [1,2,4,6,3,7,5,9,0,5,7]
print quicksort(seq) >>> [0, 1, 2, 3, 4, 5, 5, 6, 7, 7, 9]
利用上面的函数partition,可以使用二分法查找第k个最小的元素(不排序)
# 选择数组中第k小元素
def select(seq, k):
lo, pi, hi = partition(seq) # [<= pi], pi, [> pi]
m = len(lo)
if m == k: return pi # 找到第k最小值
elif m < k:
return select(hi,k-m-1)
else:
return select(lo,k)
调用方法:
# 原数组:seq = [1,2,4,6,3,7,5,9,0,5,7]
# 排序后:[0, 1, 2, 3, 4, 5, 5, 6, 7, 7, 9]
print select(seq,6) >>> 5
python数据结构与算法——快速排序的更多相关文章
- python数据结构与算法
最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...
- Python数据结构与算法--List和Dictionaries
Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...
- Python数据结构与算法--算法分析
在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- Python数据结构与算法之图的广度优先与深度优先搜索算法示例
本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法.分享给大家供大家参考,具体如下: 根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 ...
- Python 数据结构和算法
阅读目录 什么是算法 算法效率衡量 算法分析 常见时间复杂度 Python内置类型性能分析 数据结构 顺序表 链表 栈 队列 双端队列 排序与搜索 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归 ...
- Python数据结构与算法(几种排序)
数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是 ...
- Python数据结构与算法?
数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是 ...
- python数据结构与算法之问题求解实例
关于问题求解,书中有一个实际的案例. 上图是一个交叉路口的模型,现在问题是,怎么安排红绿灯才可以保证相应的行驶路线互不交错. 第一步,就是把问题弄清楚. 怎么能让每一条行驶路线不冲突呢? 其实,就是给 ...
随机推荐
- 第十二天 jni 了解
1 .什么是jni java native interface 是一种协议. 用于java 和C 语言之间进行 通讯. 2. java 8中基本类型 . byte (1个字节) short ...
- 【Unity基础知识之三】Unity Assets目录下的特殊文件夹名称
Unity3D的特殊目录名称 Unity预留了一些目录名称,这些目录有着特殊的含义.比较重要的有: Resources这个目录下的所有文件都会被打包到发布版本中,程序可以通过文件路径来访问它们.这 ...
- My favorite bit torrent client for Ubuntu
Deluge Bit Torrent ClientDeluge is among my favorite bit torrent clients for Ubuntu. It is fast, sli ...
- CSS3之尖角标签
如图所示,Tag标签的制作通常使用背景图片,现在用CSS3代码就能实现尖角效果(需浏览器支持CSS3属性). 运用CSS3样式实现尖角标签,只需要写简单的HTML结构和CSS样式. <p> ...
- Java注释@Override
@Override指定方法覆载.它可以强制一个子类必须覆盖父类的方法. package ch14; /** * Created by Jiqing on 2016/12/27. */ public c ...
- openssl证书相关
http://blog.csdn.net/modianwutong/article/details/43059435 http://www.cnblogs.com/E7868A/archive/201 ...
- CSS设置透明的两种方式
1..demo{ background-color:transparent; } 2..demo{ background-color:rgba(0,0,0,0.5); //最后一个参数是用来设置透明度 ...
- JS历史
JavaScript伴随着互联网的发展一起发展.互联网周边技术的快速发展,刺激和推动了JavaScript语言的发展. 2006年,jQuery函数库诞生,作者为John Resig.jQuery为操 ...
- CentOS7 增加tomcat 启动,停止,使用systemctl进行配置
1,centos7 使用 systemctl 替换了 service命令 参考:redhat文档: https://access.redhat.com/documentation/en-US/Red_ ...
- android产品业务逻辑对app稳定影响太大
产品经理们, 看看你们的交互文档, 有n个逻辑分支, 在我们的实现中至少存在2*n个逻辑分支 这样极度造成了app的不稳定性,表现就是 非必须的bug很多.还有就是维护性极差 当然你们会说,你们可以写 ...