按照数组存储,存储形式为二叉树,示意图如下。数组q.
第一个插入元素首先在q[0]位置
第二个插入元素在q[1],然后比较q[1]与q[0]的大小,如果q[1]<q[0],交换,否则不交换
第三个插入元素在q[2],然后比较q[2]与q[0]的大小,如果q[2]<q[0],交换,否则不交换
第四个插入元素在q[3],然后比较q[3]与q[1]的大小,如果q[3]<q[1],交换否则不交换,然后比较q[1]与q[0],如果q[1]<q[0],交换,否则不交换
第五个插入元素在q[4],然后比较q[4]与q[1]的大小,如果q[4]<q[1],交换否则不交换,然后比较q[1]与q[0],如果q[1]<q[0],交换,否则不交换
第六个插入元素在q[5],然后比较q[5]与q[2]的大小,如果q[5]<q[2],交换否则不交换,然后比较q[2]与q[0],如果q[2]<q[0],交换,否则不交换
第七个插入元素在q[6],然后比较q[6]与q[2]的大小,如果q[6]<q[2],交换否则不交换,然后比较q[2]与q[0],如果q[2]<q[0],交换,否则不交换
其他依次类推:
java 源码公式如下:
private void siftUpComparable(int k, E x) {
Comparable<? super E> key = (Comparable<? super E>) x;
while (k > 0) {
int parent = (k - 1) >>> 1;
Object e = queue[parent];
if (key.compareTo((E) e) >= 0)
break;
queue[k] = e;
k = parent;
}
queue[k] = key;
}
对有限队列使用比较器,不能对整个数组进行排序,仅仅能达到对最优先q[0]处元素的最值
PriorityQueue<Integer> q = new PriorityQueue<>((s1,s2) -> s2 - s1);//q[0]处的元素是最大值
PriorityQueue<Integer> q = new PriorityQueue<>();//q[0]处的元素是最小值
有限队列输入无序结构
插入元素方法:offer(E e),或者add (E e),其原理一样,add调用offer进行元素插入
元素删除:poll()函数,删除首个元素,其余元素重新排列
初始列表如图[2, 3, 3, 5, 4, 12, 31, 8]
第一次删除元素,数组元素长度减一,比较q[1],q[2]的元素大小,如果q[1]>q[2],那么q[0]=q[2],否则q[0]=q[1](即首轮比较,将父节点的两个子节点中,值小的元素作为新的父节点)。如上图所示,q[0] = q[1]。然后比较q[1]的两个子节点的大小,将较小的值赋给q[1],如上图所示,q[1] = q[4].最后将数组最后一个元素赋给q[4]。结果变为下图:[3, 4, 3, 5, 8, 12, 31]
第二次删除元素,数组元素长度减一,比较q[1],q[2]的元素大小,如果q[1]>q[2],那么q[0]=q[2],否则q[0]=q[1]。如上图所示,q[0] = q[2]。然后比较q[2]的两个子节点的大小,将较小的值赋给q[2],即q[2] = q[5]。最后将数组最后一个元素赋给q[5]结果变为下图:[3, 4, 12, 5, 8, 31]
第三次删除元素,数组元素长度减一,比较q[1],q[2]的元素大小,如果q[1]>q[2],那么q[0]=q[2],否则q[0]=q[1]。如上图所示,q[0] = q[1]。然后比较q[1]的两个子节点的大小,将较小的值赋给q[1],即q[1] = q[3]。最后将数组最后一个元素赋给q[3]结果变为下图:[4, 5, 12, 31, 8]
java源码如下:其中k=0,x是组数最后一个元素
private void siftDownComparable(int k, E x) {
Comparable<? super E> key = (Comparable<? super E>)x;
int half = size >>> 1; // loop while a non-leaf
while (k < half) {
int child = (k << 1) + 1; // assume left child is least
Object c = queue[child];
int right = child + 1;
if (right < size &&
((Comparable<? super E>) c).compareTo((E) queue[right]) > 0)
c = queue[child = right];
if (key.compareTo((E) c) <= 0)
break;
queue[k] = c;
k = child;
}
queue[k] = key;
}
删除元素方法:poll(),remove,remove(Object o)。
其中remove调用poll方法。remove(Object o)调用原理方法,k是要删除的元素的索引,x是要删除的元素