java priorityqueue是用数组实现的二叉小顶堆来实现排序的。
什么是小顶堆
小顶堆是一种经过排序的完全二叉树, 其满足如下性质:
小顶堆中的任意父节点都比其两个孩子结点小
所以:
小顶堆的根节点为整个堆元素中最小的元素
小顶堆转化为数组。 nodeno即为数组的下标
leftNo = parentNo*2+1
rightNo = parentNo*2+2
parentNo = (nodeNo-1)/2
例子:
代码实现过程
代码实现为加入3这个节点的时候会根据当前新插入的数组元素的下标,即为加入之前数组的size为k
k-1/2。即为parent的下标,然后比较大小,根据比较结果进行换位继续和parent进行比较到
满足小顶堆的条件为止。
这是插入算法时间复杂度为O log(N)
我们继续看下删除
代码中的实现为
实现代码如上。
移除首节点之后,比较首节点的两个子节点的大小,小的成为父节点。然后成为父节点的节点在比较其原来的子节点。
循环下来,比较次数为size>>1次。
算法时间复杂度为 O log(N)