优先级队列 —— 堆

本文介绍了堆的概念,包括大根堆和小根堆,并详细讲述了最大堆的实现,包括添加元素的上浮操作、取出最大值的下沉操作以及如何建堆。最后,讨论了优先级队列的实现,通常利用堆来高效处理高优先级的对象。
摘要由CSDN通过智能技术生成


​1. 堆的概念

堆在逻辑上是一棵完全二叉树,物理上是保存在数组中的。满足任意节点的值都大于其子树中节点的值,叫做大根堆,任意节点的值都小于其子树中节点的值叫做小根堆。堆的基本作用是快速找集合中的最值。
在这里插入图片描述

2. 最大堆的实现

2.1 向堆中添加元素(进行上浮操作 siftUp)

数组尾插添加元素,添加元素后,可能会破坏最大堆的定义,因此进行元素上浮操作 siftUp,需要调整前,左右子树已经是一个堆,才能调整。然后进行 siftUp 操作直到把当前元素上浮到合适位置。
在这里插入图片描述

public void add(int val) {
        // 1. 向数组末尾添加元素
        data.add(val);
        // 2. 调整当前堆的结构,使其仍然满足最大堆的性质
        siftUp(data.size() - 1);
    }
    
    // 元素上浮操作
    private void siftUp(int i) {
        while(i > 0 &&
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值