堆的定义:n个元素的序列 {k1, k2, ..., kn} 称之为堆,当且仅当满足一下条件时:
(1)
且
或 (2)
且
堆的存储:我们用一维数组来存储堆
堆的性质:堆实质上是满足如下性质的完全二叉树:树中所有非终端节点的值均不大于(或不小于)其左右孩子结点的值
堆的示例:
大根堆 小根堆
堆的调整:从r[2s]和r[2s+1]中选出关键字较大者,假设r[2s]的关键字较大,比较r[s]和r[2s]的关键字
1.若r[s].val >= r[2s].val,无需做任何调整
2.若r[s].val < r[2s].val,交换r[s]与r[2s],若以r[2s]为根的子树不是堆,重复上述过程,将以r[2s]为根的子树调整为堆
直至进行到叶子结点为止
这就是调整堆的方法:筛选法
堆的建立:在一棵完全二叉树中利用筛选法,从最后一个分支结点floor(n/2),...,1的结点作为根的子树都调整为堆即可
优先队列:基于普通队列的基本操作,优先队列都有,只不过每次出队的都是优先级最大的那个元素,在它的内部逻辑中是用
是用堆实现的
相关题目题解链接:
https://blog.csdn.net/weixin_41602489/article/details/99568927
https://blog.csdn.net/weixin_41602489/article/details/99585503