PriorityQueue源码分析

优先队列

  1. 内部实现是是堆,结构是数组,使用堆排序
  2. 初始化容量11,如果插入数的时候,大于当前队列数组容量,则扩容
  3. 扩容方案:如果当前数组小于64,则扩容一倍,如果大于,则扩容50%, 这用Arrays.copyOf将原有数组放到另一块新的空间

内部实现堆排序主要靠三个函数(private):
堆排序,父节点:i,两个儿子节点:2i+1、2i+2
最大堆为例(可以comparator来自定义优先级):

  1. siftup(k,E):k插入位置,E插入的元素,将E从当前位置k不断上浮(与父节点比较,如果大于父节点,父子交换,继续上浮),找到E元素应该的位置
  2. siftDown(k,E):k插入位置,E插入的元素,将E从当前位置k不断下浮(与当前节点左右子节点比较,如果小于左or右子节点,父子交换,继续下沉),找到E元素应该的位置
  3. heapify(): 初始化堆,从非叶子结点进行下沉siftDown调整,最终结果最大元素在堆顶。相当于堆排序的第一步。
    可见:PriorityQueue队列并非所有元素有序,只是保证第一个元素优先级最高。

核心函数(public):

  1. offer(E e),队列中插入e元素:1. 是否需要扩容;2. 将e元素插入队尾,上浮siftup(size, E)
  2. remove(E e), 队列中删除e元素:
    1)找到e元素在队列中的index(直接遍历数组找就行),
    2) 如果index==size-1,index位置直接为null即可;
    3) 将末尾的元素放到index位置,下浮siftDown(index, E),如果没有下浮,则上浮,如果上浮成功,则返回最末尾元素(因为如果是遍历,因为最末尾元素上浮,无法访问到该元素,要把该元素返回供访问)其他情况返回null(因为下浮或者在index位置,都可以访问到该元素,所以直接返回null即可)

参考:
https://www.jianshu.com/p/df781ec91740

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值