算法:堆和优先队列

本文介绍了堆数据结构的基本概念,包括大顶堆和小顶堆的特点。详细解释了如何通过数组实现堆,并探讨了堆的基本操作如插入和删除,以及如何通过调整节点来保持堆的特性。此外还提到了堆的应用场景,例如堆排序和优先队列。

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

堆是一个满足一定性质的二叉树。大顶堆的意思是父节点的值总是不小于子节点的值,小顶堆则正好相反。对于任何序列,建堆的时间复杂度为o(n)。堆的底层可以直接使用数组实现。

堆的操作

堆的插入

这里写图片描述

堆的删除

堆只支持删除跟节点的元素。将最后一个跟节点和最后一个元素交换,然后删除最后一个元素,然后数据下沉依次调整。

因此将堆顶元素与堆尾元素交换,然后进行调整使其满足堆的约束条件

调整思想如下:

从根节点开始调整比较根节点值与左右孩子节点的值,
1如果根节点值为最大值则满足条件
2如果右孩子存在且最大值为右孩子,则将根节点与右孩子交换
3如果左孩子存在且最大值为左孩子,则将根节点与左孩子交换

应用:堆排序

参考排序
https://www.cnblogs.com/chengxiao/p/6129630.html
简单而言就是构建一个初始堆,然后从最后一个非叶子节点开始,从右到左,从下到上不断将这个节点决定是否下沉。

应用:优先队列

可以看到java具体的实现java.util.PriorityQueue

    private void siftUpComparable(int k, E x) {
        Comparable<? super E> key = (Comparable<? super E>) x;
        while (k > 0) {
            int parent = (k - 1) >>> 1;
            Object e = queue[parent];
            if (key.compareTo((E) e) >= 0)
                break;
            queue[k] = e;
            k = parent;
        }
        queue[k] = key;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值