堆的算法
优先行列是一种抽象数据类型,最主要的操纵是删除最大元素和插进去元素。
用长度为N+1的数组pq[]来示意一个大小为N的堆,堆元素放在pq[1]至pq[N]中,不运用pq[0]。
function MaxPQ(){
var pq = [],
n = 0;
this.show = function(){
console.log(pq);
}
this.insert = function(v){
pq[++n] = v;
swim(n);
}
this.delMax = function(){
var max = pq[1];
exch(1, n--);
pq[n+1] = null;
sink(1);
return max;
}
//由下至上的堆有序化(上浮)的完成
function swim(k){
while((k > 1) && less(Math.floor(k/2), k)){
exch(Math.floor(k/2), k);
k = Math.floor(k/2);
}
}
//由上至下的堆有序化(下沉)的完成
function sink(k){
while(2*k <= n){
var j = 2*k;
if((j < n) && less(j, j+1)){
j++;
}
if(!less(k, j)){
break;
}
exch(k, j);
k = j;
}
}
//堆完成的比较和交流要领
function less(i, j){
return pq[i] < pq[j];
}
function exch(i, j){
var temp = pq[i];
pq[i] = pq[j];
pq[j] = temp;
}
}