python实现最小堆

本文介绍了最小堆的特点,它是一颗完全二叉树,其中父节点的值小于子节点,根节点的值是最小的。提供了两种方法实现最小堆:1) 从根节点遍历到最后一个有子节点的节点,比较并交换;2) 从最后一个有子节点的节点向上遍历。通过这两种方法可以构建最小堆。示例展示了建堆后的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最小堆特点:

  • 类似一颗完全二叉树
  • 二叉树中所有的父节点的值都小于其子节点;
  • 根节点的值必定是所有节点中最小的。

父节点值不大于子节点且根节点值最小称为最小堆,反之称为最大堆。最大堆和最小堆没有本质上的区别。如下图是一个典型的最小堆:
在这里插入图片描述
方法一:
从根节点(index = 0)遍历到最后一个拥有子节点的节点(index = N//2 -1),将父节点与其子节点值作比较,必要时进行交换即可。完成一次上述过程后就能完成最底层节点的归位了。元素个数为N的二叉树层数为ceil(log2n),因此一共执行floor(log2n)次上述过程就能实现最小堆的建堆了。

如下例:
在这里插入图片描述

import math
def heap(li):
    n=len(li)
    for i in range(0,int(math.log(n,2))):
        for j in range(0,n//2):
            if 2*j+2<n and li[2*j+2]<li[2*j+1]:
                k=2*j+2
            else:
                k=2*j+1
            if li[k]<li[j]:
                li[k],li[j]=li[j],li[k]
d
if __name__ == '__main__':
    
    li=[1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
    heap(li)
    print(li)
  

结果:[-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]

方法2:
思路还是一样,这次从最后一个拥有子节点的节点向上遍历

import math

def heap2(li,root):
    if 2*root+1<len(li):
        if 2*root+2<len(li) and li[2*root+2]<li[2*root+1]:
            k=2*root+2
        else:
            k=2*root+1
        if li[k]<li[root]:
            li[k],li[root]=li[root],li[k]
            heap2(li,k)
if __name__ == '__main__':

    for i in range(len(li)//2-1,-1,-1):
        heap2(li,i)
    print(li)

结果:[-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值