二叉堆代码实现(python)

二叉堆

二叉堆本质上是一种完全二叉树。堆的插入和删除操作,时间复杂度是O(logn),构建的复杂的是O(n)。
二叉堆的存储方式为顺序存储,所有结点都存储在数组中

def up_adjust(array=[]):
    '''
    二叉堆尾结点上浮操作
    :param array: 原数组
    :return:
    '''
    child_index = len(array)-1
    parent_index = (child_index-1)//2
    temp = array[child_index]#保存插入叶子结点的值,用于最后赋值

    while child_index >0 and temp < array[parent_index]:
        array[child_index] = array[parent_index]
        child_index = parent_index
        parent_index = (parent_index-1)//2
    array[child_index] = temp

def down_adjust(parent_index, length, array=[]):
    '''
    二叉堆结点下沉操作,最终每一个孩子都小于它的左右孩子
    :param parent_index: 带下沉结点下标
    :param length: 堆的长度范围
    :param array: 原数组
    :return:
    '''
    temp = array[parent_index]
    child_index = 2*parent_index+1

    while child_index<length:
        #如果有右孩子,且右孩子的值小于左孩子的值,则定位到右孩子
        if child_index + 1 < length and array[child_index+1] < array[child_index]:
            child_index += 1
        #如果父节点的值小于任何一个孩子的值,跳出
        if temp <= array[child_index]:
            break
        array[parent_index] = array[child_index]
        parent_index = child_index
        child_index = 2 * child_index + 1

    array[parent_index] = temp

def build_heap(array=[]):
    '''
    构建二叉堆
    :param array: 原数组
    :return:
    '''

    #从最后一个非叶子结点开始,依次下沉调整
    for i in range(len(array)-2 // 2, -1 ,-1):
        down_adjust(i,len(array),array)
        print(array)



if __name__ == '__main__':
    #二叉堆可用于堆排序及优先队列
    my_array = [1,3,2,6,5,7,8,9,4]
    up_adjust(my_array)
    print(my_array)

    my_array = [7,1,3,10,5,2,8,9,6]
    build_heap(my_array)

参考:《漫画算法》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dijkstra算法是一种用于解决单源最短路径问题的经典算法,而二叉堆是一种常用的数据结构,用于实现Dijkstra算法中的优先队列。下面是Dijkstra算法结合二叉堆Python代码实现: ```python import heapq def dijkstra(graph, start): # 初始化距离字典,用于记录起点到各个节点的最短距离 distances = {node: float('inf') for node in graph} distances[start] = 0 # 初始化优先队列,用于存储待处理的节点 queue = [(0, start)] while queue: # 弹出当前最小距离的节点 current_distance, current_node = heapq.heappop(queue) # 如果当前节点已经被处理过,则跳过 if current_distance > distances[current_node]: continue # 遍历当前节点的邻居节点 for neighbor, weight in graph[current_node].items(): distance = current_distance + weight # 如果通过当前节点到达邻居节点的距离更短,则更新最短距离并加入优先队列 if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(queue, (distance, neighbor)) return distances ``` 上述代码中,`graph`表示图的邻接表表示,`start`表示起点。`distances`字典用于记录起点到各个节点的最短距离,初始时将所有节点的距离设为无穷大,起点的距离设为0。`queue`优先队列用于存储待处理的节点,初始时将起点加入队列。 在算法的主循环中,每次从优先队列中弹出当前最小距离的节点,然后遍历其邻居节点。如果通过当前节点到达邻居节点的距离更短,则更新最短距离并将邻居节点加入优先队列。 最后,返回`distances`字典,即起点到各个节点的最短距离。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值