二叉堆是一种完全二叉树,我们可以使用列表来方便存储,也就是说,用列表将树的所有节点存储起来。

如下图,是小根堆方式的二叉堆,假设父节点的下标为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实现的更多相关文章

  1. python下实现二叉堆以及堆排序

    python下实现二叉堆以及堆排序 堆是一种特殊的树形结构, 堆中的数据存储满足一定的堆序.堆排序是一种选择排序, 其算法复杂度, 时间复杂度相对于其他的排序算法都有很大的优势. 堆分为大头堆和小头堆 ...

  2. 二叉堆 及 大根堆的python实现

    Python 二叉堆(binary heap) 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子 ...

  3. Python实现二叉堆

    Python实现二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树).二叉堆有两种:最大堆和最小堆.最大堆:父结点的键值总是大于或等于任何一个子节点的键值:最小堆: ...

  4. python 二叉堆

    BinaryHeap() 创建一个新的,空的二叉堆. insert(k) 向堆添加一个新项. findMin() 返回具有最小键值的项,并将项留在堆中. delMin() 返回具有最小键值的项,从堆中 ...

  5. 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列

    概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...

  6. AC日记——二叉堆练习3 codevs 3110

    3110 二叉堆练习3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给定N(N≤500,000)和N个整 ...

  7. codevs 3110 二叉堆练习3

    3110 二叉堆练习3 http://codevs.cn/problem/3110/ 题目描述 Description 给定N(N≤500,000)和N个整数(较有序),将其排序后输出. 输入描述 I ...

  8. 数据结构图文解析之:二叉堆详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  9. POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆

    考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...

随机推荐

  1. codevs1298, hdu1392 (凸包模板)

    题意: 求凸包周长. 总结: 测试模板. 代码: #include <iostream> #include <cstdio> #include <cstring> ...

  2. vant学习网址

    https://youzan.github.io/vant/#/zh-CN/swipe-cell 我推荐大家可以在这个网址上面学习vant相关的知识   里面有代码解说和详细的代码

  3. eclipse快捷键(Mac版)整理

    eclipse快捷键(Mac版)整理 前言: 最近在学习JDBC,老师用的是eclipse,对于习惯了IDEA的我来说,没有了快捷键,效率明显下降. 我认为,开发工具的熟练使用,也是程序员必备的一项技 ...

  4. abstract关键字的说法

    含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象.含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必 ...

  5. elasticsearch mysql配置

    1,开启bin-log 2,binglog_foramt格式必须为row 3,配置server_id为1001 4,binlog-row-image 必须为full log-bin=mysql-bin ...

  6. HashMap 中的哈希值计算问题

    date: 2020-08-21 16:48:00 updated: 2020-08-21 16:52:00 HashMap 中的哈希值计算问题 1. hash 计算 JDK1.8 HashMap源码 ...

  7. 执行 vue inspect > output.js 报错,无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\vue.ps1,因为在此系统中禁止执行脚本

    无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\vue.ps1,因为在此系统中禁止执行脚本.有关详细信息,请参阅 "get-help ab ...

  8. 常用数据结构-集合(set)

    集合(set)是python中最容易被忽视的.使用集合的主要好处在于速度快. 集合的一些特性: 集合元素不能重复 不支持索引访问集合中的元素 集合使用散列之后,可以在O(1)时间内访问元素 支持一些常 ...

  9. python使用pandas进行数据处理

    pandas数据处理 关注公众号"轻松学编程"了解更多. 以下命令都是在浏览器中输入. cmd命令窗口输入:jupyter notebook 打开浏览器输入网址http://loc ...

  10. mysql 一主多从环境搭建(亲测)

    前期准备 三台服务器,服务器使用的是 centos7 mysql-5.7.24-linux-glibc2.12-x86_64 安装包 使用是版本是 mysql-5.7.24 数据库安装 将 mysql ...