二叉堆代码实现

1.简介

​ 二叉堆本质上是一棵完全二叉树,它分为最大堆和最小堆。最大堆就是它里面的任何一个父节点的值,都大于或者等于它的左、右孩子节点的值。最小堆就是其中的任何一个父节点的值都小于或者等于它左、右孩子节点的值。二叉堆中的根节点叫做堆顶,最大堆和最小堆决定了:最大堆的堆顶是整个堆中最大的元素,最小堆的堆顶是整个堆中最小的元素。

2.二叉堆的代码实现

二叉堆虽然是一棵完全二叉树,但是它的存储方式并不是链式存储,而是顺序存储,也就说,夜叉对中的所有节点都存储在数组中。假设父节点的下表为parent,则她的左孩子的下标为2parent+1,右孩子的下表为2parent+2

2.1 构建堆
public static void buildHead(int[] array){
	//从最后一个非叶子节点开始,依次做“下沉”调整
	for(int i = (array.length - 2) / 2; i >= 0; i--){
		downAdjust(array,i,array.length);
	}
}
2.2 上浮调整
public static void upAjust(int[] array){
        int childIndex = array.length - 1;
        int parentIdex = (childIndex - 1) / 2;
    	//temp保存插入的叶子节点的值,用于最后的赋值
        int temp = array[childIndex];
        while(childIndex > 0 && temp < array[parentIdex]){
            //无须真正交换,单向赋值即可
            array[childIndex] = array[parentIdex];
            childIndex = parentIdex;
            parentIdex = (parentIdex - 1) / 2;
        }
        array[childIndex] = temp;
}
2.3 下沉调整
public static void downAdjust(int[] array,int parentIndex,int length){
    	//temp保存父节点的值,用于最后的赋值
        int temp = array[parentIndex];
        int childIndex = 2 * parentIndex + 1;
        while(childIndex < length){
            //如果有右孩子,而且右孩子小于左孩子的值,则定位到右孩子
            if(childIndex + 1 < length && array[childIndex + 1] < array[childIndex]){
                childIndex++;
            }
            //如果父节点小于任何一个孩子的值,则直接跳出
            if(temp <= array[childIndex])
                break;
            //无须真正交换,单向赋值即可
            array[parentIndex] = array[childIndex];
            parentIndex = childIndex;
            childIndex = 2 * childIndex + 1;
        }
        array[parentIndex] = temp;
}
2.4 测试方法
public static void main(String[] args){
        int[] array = {1,3,2,6,5,7,8,9,10,0};
        upAjust(array);
        System.out.println(Arrays.toString(array));

        array = new int[]{7,1,3,10,5,2,8,9,6};
        buildHead(array);
        System.out.println(Arrays.toString(array));
}
  • 1
    点赞
  • 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、付费专栏及课程。

余额充值