1.概念
优先队列:普通的队列具有先进先出的特性,元素追加在队尾,如果删除的话,从队头删除。而在优先队列中,队列中的数据被赋予了优先级。当访问元素时,优先级最高的会先被删除。所以说优先队列是最高级数据先出。
堆:堆是指一个可以被看成一棵树的数组对象,堆总是满足下面两个性质:(1)堆中的某个节点必然小于(堆顶最大)或者大于(堆顶最小)其父节点的值;(2)所谓的堆呢,总是一棵完全二叉树。
堆有序:当一棵二叉树的每个节点,都大于等于他的两个子节点时,它被称为堆有序。
一棵大小为N的完全二叉树的高度为log2N+1(以2为底的)
2.堆有序化的两种方式
(1)由下至上的堆有序化
如果一个堆有序,因为某个节点的变化,这个节点比它的父节点还要大的时候,那么我们就需要通过交换该节点和父节点的关系来修复堆的顺序。交换之后这个节点还有可能比它现在的父节点大,再次交换它和它当前父节点的位置,以此类推,一直到这个节点小于它的父节点为止。因此这个大根堆将被恢复有序。
部分代码如下:
private void swim(int k){
while(k > 1 && K/2 < k){
int temp = k/2;
k/2 = k;
k = temp;
}
}
(2)由上至下的堆有序化
这种情况出现在和上面一种情况正好相反的状况中:在堆有序的状态下,因为某个节点小于它的两个子节点其中之一的时候,而顺序被打破。那么我们通过交换他和两个字节点中的较大者来将其恢复。这个节点在大根堆中处于一下向下移动的状态,因此形象的称之为“下沉”
部分代码如下:
private void sink(){
while(2 * k <= N){
int j = 2*k;
if(j < N && j < j + 1) j++;
if(!k < j) break;
k = j;
}
}
对于多叉堆的这些情况,同二叉堆。
3.优先队列的对路归并问题
有一个博主将的很不错
http://www.cnblogs.com/songdechiu/p/6736114.html