【数据结构】优先级队列(堆)

优先级队列依旧是队列,依旧遵循着先进先出的原则,不过和队列所不一样的是,优先级队列操作的数据有优先级,优先级高的数据先出队列,优先级队列底层所使用的数结构便是堆

目录

1.堆

1.1堆的概念

1.2创建堆

1.3插入数据

1.4删除数据

2.Java的优先级队列

2.1PriorityQueue的特性


1.堆

1.1堆的概念

我们可将堆看成是一颗完全二叉树按照层序遍历的方式将数据放在一个一维数组中构成的,堆又有大根堆和小根堆之分

大根堆:父节点的值不小于子节点的值称之为大堆,根节点的值为堆的最大值时称为“大根堆”

小根堆:父节点的值不大于子节点的值称之为小堆,根节点的值为堆的最小值时称为“小根堆”

下面依旧模拟实现一个堆

1.2创建堆

以大根堆为例,二叉树以下图为例

 上面的二叉树并不是按照大根堆来进行排序的,所以我们需要对其进行调整

1.按照层序遍历的方式找到最后一颗子树的根节点开始进行调整,图中就是下标为4的位置开始,从4开始依次往前

2.每一颗子树都是从根节点开始往下进行调整

具体的调整过程如图

 

那么现在有两个问题:

1.如何确定最后一颗子树的根节点?

2.如何判断子树是否调整完成?

假设树中节点个数为len,那么最后一个节点的下标就是len-1,按照二叉树性质,最后一个节点的父节点下标就是(len-1-1)/2,同时len也能作为判断子树是否调整完成的依据(所有节点的下标都不能超过len)

代码如下:

public int[] elem;
p
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星鸦wyk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值