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