算法笔记(JavaScript版)——优先行列

堆的算法

优先行列是一种抽象数据类型,最主要的操纵是删除最大元素和插进去元素。

用长度为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;
  }
}
    原文作者:XinY92
    原文地址: https://segmentfault.com/a/1190000006181345
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞