ELEMENTS爱乐小超 2020-07-04
二叉堆是一种特殊的二叉树。
// 创建最小堆 class MinHeap { constructor(compareFn = defaultCompare){ this.compareFn = compareFn this.heap = [] } } MinHeap.prototype.getLeftIndex = function(index){ return 2 * index + 1 } MinHeap.prototype.getRightIndex = function(index){ return 2 * index + 2 } MinHeap.prototype.getParentIndex = function(index){ if(index === 0){ return undefined } return Math.floor((index - 1) / 2) } MinHeap.prototype.insert = function(value){ if(value != null){ this.heap.push(value) this.shiftUp(this.heap.length - 1) } } MinHeap.prototype.shiftUp = function(index){ let parentIndex = this.getParentIndex(index) while(index > 0 && this.heap[parentIndex] > this.heap[index]){ swap(this.heap,parentIndex,index) index = parentIndex parentIndex = this.getParentIndex(index) } } MinHeap.prototype.size = function(){ return this.heap.length } MinHeap.prototype.isEmpty = function(){ return this.size() == 0 } MinHeap.prototype.findMinimum = function(){ return this.isEmpty() ? undefined : this.heap[0] } MinHeap.prototype.extract = function(){ if(this.isEmpty()){ return undefined } if(this.size() == 1){ return this.heap.shift() } const removedValue = this.heap.shift() this.shiftDown(0) return removedValue } MinHeap.prototype.shiftDown = function(index){ let element = index const left = this.getLeftIndex(index) const right = this.getRightIndex(index) const size = this.size() if(left < size && this.heap[element] - this.heap[left] > 0){ element = left }else if(right < size && this.heap[element] - this.heap[right] > 0){ element = right } if(index !== element){ swap(this.heap,index,element) this.shiftDown(element) } }