二叉堆python实现
二叉堆是一种完全二叉树,我们可以使用列表来方便存储,也就是说,用列表将树的所有节点存储起来。
如下图,是小根堆方式的二叉堆,假设父节点的下标为p,则他的左孩子下标为2P+1,右孩子下标为2P+2

class BuildHeap:
"""构建一个小根堆二叉树
预先定义一个下标为0的元素,实际没有用途,只是为了方便计算乘除
假设节点下标为i 父节点下标为i//2 左子节点2i 右子节点2i+1
不加下标为0时,假设父节点下标i,子节点为2i+1,右子节点2i+2
""" def __init__(self):
# 下标0的元素没有用,但为了后面代码可以用到简单的整数
# 乘除法,仍保留它。
self.heaplist = [0]
self.current_size = 0 def size(self):
return len(self.heaplist) def percUp(self, i):
"""上浮"""
while i // 2 > 0:
if self.heaplist[i] < self.heaplist[i // 2]:
# 与父节点交换。
self.heaplist[i], self.heaplist[i // 2] = self.heaplist[i // 2], self.heaplist[i]
i // 2 # 沿路径向上 def insert(self, key):
self.heaplist.append(key) # 添加到末尾
self.current_size += 1
self.percUp(self.current_size) # 新key上浮 def percDown(self, i):
"""下沉"""
while (i * 2) <= self.current_size:
mc = self.minChild(i)
if self.heaplist[i] > self.heaplist[mc]:
# 交换,下沉
self.heaplist[i], self.heaplist[mc] = self.heaplist[mc], self.heaplist[i]
i = mc # 沿路径向下 def minChild(self, i):
"""找最小的子节点""" # 判断叶子节点的情况
if i * 2 + 1 > self.current_size:
return i * 2
# 返回较小的子节点
elif self.heaplist[i * 2] < self.heaplist[i * 2 + 1]:
return i * 2
else:
return i * 2 + 1 def delMin(self):
"""移走整个堆中最小的key:根节点heapList[1]"""
retval = self.heaplist[1] # 移走堆顶
# 最后的叶子节点移到堆顶,然后size-1,把叶子节点删除
self.heaplist[1] = self.heaplist[self.current_size]
self.current_size -= 1
self.heaplist.pop()
self.percDown(1) # 新顶下沉
return retval def buildHeap(self, alist):
"""利用下沉法,构建堆"""
i = len(alist) // 2 # 从最后节点的父节点开始。
self.current_size = len(alist)
self.heaplist = [0] + alist[:] while i > 0:
self.percDown(i)
i -= 1 import random
l = [i for i in range(1,6)]
random.shuffle(l)
bh = BuildHeap()
bh.buildHeap(l)
l_sort = []
for i in range(1,bh.size()):
l_sort.append(bh.delMin()) print(l_sort)
二叉堆python实现的更多相关文章
- python下实现二叉堆以及堆排序
python下实现二叉堆以及堆排序 堆是一种特殊的树形结构, 堆中的数据存储满足一定的堆序.堆排序是一种选择排序, 其算法复杂度, 时间复杂度相对于其他的排序算法都有很大的优势. 堆分为大头堆和小头堆 ...
- 二叉堆 及 大根堆的python实现
Python 二叉堆(binary heap) 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子 ...
- Python实现二叉堆
Python实现二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树).二叉堆有两种:最大堆和最小堆.最大堆:父结点的键值总是大于或等于任何一个子节点的键值:最小堆: ...
- python 二叉堆
BinaryHeap() 创建一个新的,空的二叉堆. insert(k) 向堆添加一个新项. findMin() 返回具有最小键值的项,并将项留在堆中. delMin() 返回具有最小键值的项,从堆中 ...
- 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列
概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...
- AC日记——二叉堆练习3 codevs 3110
3110 二叉堆练习3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给定N(N≤500,000)和N个整 ...
- codevs 3110 二叉堆练习3
3110 二叉堆练习3 http://codevs.cn/problem/3110/ 题目描述 Description 给定N(N≤500,000)和N个整数(较有序),将其排序后输出. 输入描述 I ...
- 数据结构图文解析之:二叉堆详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
随机推荐
- java应用启动报错Unable to access jarfile xxxxx.jar
当使用命令:javar -jar xxxx.jar 启动应用时,报错Unable to access jarfile xxxxx.jar,这种主要是 jar 的名称或者路径有问题:
- Rest Framework设计规范
Rest Framework Rest Framework是前后端分离中用到的一种规范,它与框架本身无关,是一种软件架构风格,全称为Representational State Transfer. R ...
- 503. 下一个更大元素 II
503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...
- 最新主流 Markdown 编辑器推荐
Markdown ,2004年由 John Gruberis 设计和开发,是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式,以下将介绍目前比较流行的一 ...
- 【6】TensorFlow光速入门-python模型转换为tfjs模型并使用
本文地址:https://www.cnblogs.com/tujia/p/13862365.html 系列文章: [0]TensorFlow光速入门-序 [1]TensorFlow光速入门-tenso ...
- js根据ip地址获取城市地理位置
一.使用js根据ip获取地址位置 <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>& ...
- model基础操作(下)
3.Django多对多表结构操作 3.1 第一种: ManyToManyField 自己不创建第三张关系表,有m2m字段: 根据queryset对象增删改查(推荐) from django ...
- Git命令之diff
工作区(working tree),暂存区(index /stage),本地仓库(repository) git跟不同的参数,比较不同的区间的版本. git diff:是查看working tree与 ...
- python实现年会抽奖程序
用python来实现一个抽奖程序,供大家参考,具体内容如下 主要功能有 1.从一个csv文件中读入所有员工工号2.将这些工号初始到一个列表中3.用random模块下的choice函数来随机选择列表中的 ...
- UDP局域网通信的Java实现及Android平台尝试
局域网通信已经很少被他人所提及了,我曾经还尝试过通过蓝牙构建通信网络,这次有机会尝试UDP局域网通信,在这里把一些基本过程和在Android平台上的问题记录一下. 1. UDP基础知识 1.1 什么是 ...