Python实现堆
堆 (heap) 是一种经过排序的完全二叉树,其中任一非叶子节点的值均不大于(或不小于)其左孩子和右孩子节点的值。
注:定义来自百度百科。
堆,又被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队列。
其他概念解释
-
最大堆 根结点的键值是所有堆结点键值中最大者。
-
最小堆 根结点的键值是所有堆结点键值中最小者。
最小堆
最大堆
基本功能介绍及实现
在接下来的内容里,我们将逐步介绍堆的具体功能是如何实现的。
堆有两点需要了解,一是堆一般采用完全二叉树;二是堆中的每一个节点都大于其左右子节点(大顶堆),或者堆中每一个节点都小于其左右子节点(小顶堆)。
1. 创建 heap 类
1 2 3 4 | class heap( object ): def __init__( self ): #初始化一个空堆,使用数组来在存放堆元素,节省存储 self .data_list = [] |
2. 添加 get_parent_index 函数
1 2 3 4 5 6 | def get_parent_index( self ,index): #返回父节点的下标 if index = = 0 or index > len ( self .data_list) - 1 : return None else : return (index - 1 ) >> 1 |
3. 添加 swap 函数
1 2 3 | def swap( self ,index_a,index_b): #交换数组中的两个元素 self .data_list[index_a], self .data_list[index_b] = self .data_list[index_b], self .data_list[index_a] |
4. 添加 insert 函数
1 2 3 4 5 6 7 8 9 10 11 12 | def insert( self ,data): #先把元素放在最后,然后从后往前依次堆化 #这里以大顶堆为例,如果插入元素比父节点大,则交换,直到最后 self .data_list.append(data) index = len ( self .data_list) - 1 parent = self .get_parent_index(index) #循环,直到该元素成为堆顶,或小于父节点(对于大顶堆) while parent is not None and self .data_list[parent] < self .data_list[index]: #交换操作 self .swap(parent,index) index = parent parent = self .get_parent_index(parent) |
5. 添加 removeMax 函数
1 2 3 4 5 6 7 8 9 | def removeMax( self ): #删除堆顶元素,然后将最后一个元素放在堆顶,再从上往下依次堆化 remove_data = self .data_list[ 0 ] self .data_list[ 0 ] = self .data_list[ - 1 ] del self .data_list[ - 1 ] #堆化 self .heapify( 0 ) return remove_data |
6. 添加 heapify 函数
1 2 3 4 5 6 7 8 9 10 11 12 13 | def heapify( self ,index): #从上往下堆化,从index 开始堆化操作 (大顶堆) total_index = len ( self .data_list) - 1 while True : maxvalue_index = index if 2 * index + 1 < = total_index and self .data_list[ 2 * index + 1 ] > self .data_list[maxvalue_index]: maxvalue_index = 2 * index + 1 if 2 * index + 2 < = total_index and self .data_list[ 2 * index + 2 ] > self .data_list[maxvalue_index]: maxvalue_index = 2 * index + 2 if maxvalue_index = = index: break self .swap(index,maxvalue_index) index = maxvalue_index |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现