数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序
#!/usr/bin/env python
# -*- coding:utf-8 -*- '''
Author: Minion-Xu 小堆序实现从大到小排序,大堆序实现从小到大排序
重点的地方:小堆序堆顶的元素一定是堆里最小的,大堆序堆顶的元素一定是堆里最大的
小堆序:满足任何从上到下的线路依次增长
大堆序:满足任何从上到下的线路依次减小 效率:时间效率O(nlogn)
空间效率O(1)
''' #堆排序:因为队列里的元素是不满足小堆序的,所以首先要构建小堆序
#构建完小堆序后,从堆顶弹出元素(该元素最小)并将其放在堆的末尾;以此循环执行
#最终形成从大到小排序的队列
def little_heap_sort(elems):
def siftdown(elems, e, begin, end):
i, j = begin, begin*2+1
while j < end:
if j+1 < end and elems[j] > elems[j+1]:
j += 1
if e < elems[j]:
break
elems[i] = elems[j]
i, j = j, j*2 + 1
elems[i] = e #构建小堆序 O(n)
end = len(elems)
for i in range(end//2, -1, -1):
siftdown(elems, elems[i], i, end) #弹出堆顶元素放在末尾 O(nlogn)
for i in range(end-1, 0, -1): #O(n)
e = elems[i]
elems[i] = elems[0]
siftdown(elems, e, 0, i) #O(logn) # 堆排序:因为队列里的元素是不满足大堆序的,所以首先要构建大堆序
# 构建完大堆序后,从堆顶弹出元素(该元素最大)并将其放在堆的末尾;以此循环执行
# 最终形成从大到小排序的队列
def big_head_sort(elems):
def siftdown(elems, e, begin, end):
i, j = begin, begin*2 + 1
while j < end:
if j+1 < end and elems[j]<elems[j+1]:
j += 1
if e > elems[j]:
break
elems[i] = elems[j]
i, j = j, j*2 + 1
elems[i] = e #构建大堆序 O(n)
end = len(elems)
for i in range(end//2, -1, -1):
siftdown(elems, elems[i], i, end) #弹出堆顶元素放在末尾 O(nlogn)
for i in range(end-1, 0, -1):
e = elems[i]
elems[i] = elems[0]
siftdown(elems, e, 0, i) if __name__=="__main__":
l = [1,6,2,9,8,0,3,5,4,7]
little_heap_sort(l)
print(l)
#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
big_head_sort(l)
print(l)
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
堆排序: 构建堆序, 堆顶弹出, 放在堆尾,
(原)堆尾元素, 充当堆顶,向下筛选(siftdown)
数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序的更多相关文章
- 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列
概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...
- Python入门篇-数据结构堆排序Heap Sort
Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树 每个非叶子结点都要大于或者等于其左右孩子结点 ...
- 深入浅出数据结构C语言版(15)——优先队列(堆)
在普通队列中,元素出队的顺序是由元素入队时间决定的,也就是谁先入队,谁先出队.但是有时候我们希望有这样的一个队列:谁先入队不重要,重要的是谁的"优先级高",优先级越高越先出队.这样 ...
- 深入浅出数据结构C语言版(19)——堆排序
在介绍优先队列的博文中,我们提到了数据结构二叉堆,并且说明了二叉堆的一个特殊用途--排序,同时给出了其时间复杂度O(N*logN).这个时间界是目前我们看到最好的(使用Sedgewick序列的希尔排序 ...
- 数据结构之队列(Python 版)
数据结构之队列(Python 版) 队列的特点:先进先出(FIFO) 使用链表技术实现 使用单链表技术,在表首尾两端分别加入指针,就很容易实现队列类. 使用顺序表list实现 # 队列类的实现 cla ...
- 数据结构之 栈 (Python 版)
数据结构之 栈 (Python 版) -- 利用线性表实现栈 栈的特性: 后进先出 基于顺序表实现栈 class SStack(): ''' 基于顺序表 实现的 栈类 ''' def __init__ ...
- 数据结构之线性表(python版)
数据结构之线性表(python版) 单链表 1.1 定义表节点 # 定义表节点 class LNode(): def __init__(self,elem,next = None): self.el ...
- 北京大学公开课《数据结构与算法Python版》
之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...
- 学习笔记:[算法分析]数据结构与算法Python版[基本的数据结构-上]
线性结构Linear Structure ❖线性结构是一种有序数据项的集合,其中 每个数据项都有唯一的前驱和后继 除了第一个没有前驱,最后一个没有后继 新的数据项加入到数据集中时,只会加入到原有 某个 ...
随机推荐
- 信息安全-5:RSA算法详解(已编程实现)[原创]
转发注明出处:http://www.cnblogs.com/0zcl/p/6120389.html 背景介绍 1976年以前,所有的加密方法都是同一种模式: (1)甲方选择某一种加密规则,对信息进行加 ...
- Linux基础介绍【第二篇】
远程连接Linux的原理 SHH远程连接介绍 当前,在几乎所有的互联网企业环境中,最常用的Linux提供远程连接服务的工具就是SSH软件,SSH分为SSH客户端和SSH服务端两部分.其中,SSH服务端 ...
- 我的MYSQL学习心得(三) 查看字段长度
我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- CentOS 7 上部署Mono 4 和Jexus 5.6
概述 在这篇文章中我们将讨论如何在CentOS 7操作系统,安装 jexus. mono 和 配置 jexus,因此它将能够在这种环境中运行一个asp.net mvc 4 应用.这篇文章是描述如何在 ...
- Lesson 18 He often does this!
Text After I had had lunch at a village pub, I looked for my bag. I had left it on a chair beside th ...
- .NET 环境中使用RabbitMQ
在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的地方,比如发送短信 ...
- 基于Adobe Flash平台的3D页游技术剖析
写在前面 从黑暗之光,佛本是道,大战神的有插件3D页游.再到如今的魔龙之戒. 足以证明,3D无插件正在引领页游技术的潮流. 目前,要做到3D引擎,有以下几个选择. 说到这里,我们发现.这些都不重要. ...
- YY一下十年后的自己
ps:其实这篇文章的评论比文章本身更有意思,欢迎关注. 每到年底总是我最焦虑的时候,年龄越大情况越明显. 可能越长大越是对 时光的流逝 更有感触,有感触之后就会胡思乱想.所以随手开始写下这篇文章. 人 ...
- ABP(现代ASP.NET样板开发框架)系列之7、ABP Session管理
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之7.ABP Session管理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...
- 关于python中的flush问题
今天写了一个控制台下的进度条小程序,遇到了关于flush的问题,在这里小小的总结一下. 首先在要flush的字符串必须后边加上'\r'(回车) 将数据送入缓冲区这样在新打印字符的时候就可以将原来的显示 ...