优先级队列依旧是队列,依旧遵循着先进先出的原则,不过和队列所不一样的是,优先级队列操作的数据有优先级,优先级高的数据先出队列,优先级队列底层所使用的数结构便是堆
目录
1.堆
1.1堆的概念
我们可将堆看成是一颗完全二叉树按照层序遍历的方式将数据放在一个一维数组中构成的,堆又有大根堆和小根堆之分
大根堆:父节点的值不小于子节点的值称之为大堆,根节点的值为堆的最大值时称为“大根堆”
小根堆:父节点的值不大于子节点的值称之为小堆,根节点的值为堆的最小值时称为“小根堆”
下面依旧模拟实现一个堆
1.2创建堆
以大根堆为例,二叉树以下图为例
上面的二叉树并不是按照大根堆来进行排序的,所以我们需要对其进行调整
1.按照层序遍历的方式找到最后一颗子树的根节点开始进行调整,图中就是下标为4的位置开始,从4开始依次往前
2.每一颗子树都是从根节点开始往下进行调整
具体的调整过程如图
那么现在有两个问题:
1.如何确定最后一颗子树的根节点?
2.如何判断子树是否调整完成?
假设树中节点个数为len,那么最后一个节点的下标就是len-1,按照二叉树性质,最后一个节点的父节点下标就是(len-1-1)/2,同时len也能作为判断子树是否调整完成的依据(所有节点的下标都不能超过len)
代码如下:
public int[] elem;
p