1 var define = require("../define").define,
  2         Heap = require("./Heap"),
  3         base = require("../base");
  4 
  5 var floor = Math.floor, MinHeap;
  6 /**
  7  * @class <p> Min Heap implementation, lowest value in heap is always at the root.</p>
  8  * </br>
  9  * <b>Performance</b>
 10  * <table>
 11  *     <tr><td></td><td>Best</td><td>Worst</td></tr>
 12  *     <tr><td>Insert</td><td>O(log n)</td><td>O(log n)</td></tr>
 13  *     <tr><td>Remove</td><td>O(log n)</td><td>O(log n)</td></tr>
 14  *     <tr><td>Peek</td><td>O(1)</td><td>O(1)</td></tr>
 15  *     <tr><td>Contains</td><td>O(n)</td><td>O(n)</td></tr>
 16  * <table>
 17  * @name MinHeap
 18  * @augments comb.collections.Heap
 19  * @memberOf comb.collections
 20  */
 21 module.exports = exports = define(Heap, {
 22     instance : {
 23 
 24         __upHeap : function(index) {
 25             var heap = this.__heap;
 26             var node = heap[index], key = node.key, gpi = this.__getParentIndex;
 27             while (index >= 0) {
 28                 var parentIndex = gpi(index), parent = heap[parentIndex];
 29                 if (parent && parent.key > key) {
 30                     heap[index] = parent;
 31                     index = parentIndex;
 32                 } else {
 33                     break;
 34                 }
 35             }
 36             heap[index] = node;
 37         },
 38 
 39         __downHeap : function(index) {
 40             var heap = this.__heap;
 41             var node = heap[index], key = node.key, length = heap.length, max = floor(length / 2), glci = this.__getLeftChildIndex, grci = this.__getRightChildIndex;
 42             while (index < max) {
 43                 var leftIndex = glci(index),
 44                         rightIndex = grci(index), left = heap[leftIndex], right = heap[rightIndex], child, childIndex;
 45                 if (rightIndex < length && right.key < left.key) {
 46                     childIndex = rightIndex;
 47                     child = right;
 48                 } else {
 49                     childIndex = leftIndex;
 50                     child = left;
 51                 }
 52                 if (child.key < key) {
 53                     heap[index] = child;
 54                     index = childIndex;
 55                 } else {
 56                     break;
 57                 }
 58 
 59             }
 60             heap[index] = node;
 61         }
 62     }
 63 });
 64 
 65