class MinHeap {
constructor () {
this.heap = []
}
getParentIndex (index) {
return (index - 1) >> 1
}
getLeftIndex (index) {
return index * 2 + 1
}
getRightIndex (index) {
return index * 2 + 2
}
swap (index1, index2) {
const tmp = this.heap[index1]
this.heap[index1] = this.heap[index2]
this.heap[index2] = tmp
}
shiftUp (index) {
if (index === 0) return
const parentIndex = this.getParentIndex(index)
if (this.heap[index] < this.heap[parentIndex]) {
this.swap(index, parentIndex)
this.shiftUp(parentIndex)
}
}
shiftDown (index) {
const leftIndex = this.getLeftIndex(index)
const rightIndex = this.getRightIndex(index)
let minIndex
if(this.heap[leftIndex]) minIndex = this.heap[index] > this.heap[leftIndex] ? leftIndex : index
if(this.heap[rightIndex]) minIndex = this.heap[minIndex] > this.heap[rightIndex] ? rightIndex : minIndex
if (!minIndex) return
if (index !== minIndex) {
this.swap(index, minIndex)
this.shiftDown(minIndex)
}
}
insert (val) {
this.heap.push(val)
this.shiftUp(this.heap.length - 1)
}
pop () {
const res = this.heap[0]
if (this.heap.length === 1) {
this.heap.pop()
return res
}
this.heap[0] = this.heap.pop()
this.shiftDown(0)
return res
}
size () {
return this.heap.length
}
peek () {
return this.heap[0]
}
}
js 实现一个小顶堆
最新推荐文章于 2024-06-03 22:29:32 发布