<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>最小堆类</title>
</head>
<body>
<p>最小堆类</p>
<script src="./index.js"></script>
</body>
</html>
class MinHeap{
constructor() {
this.heap = []
}
// 获取堆
getHeap() {
return this.heap
}
// 获取元素父元素下标
getParentIndex(i) {
return (i - 1) >> 1
}
// 获取元素左孩子下标
getLeftIndex(index) {
return index * 2 + 1
}
// 获取元素的右孩子下标
getRightIndex(index) {
return index * 2 + 2
}
// 交换值
swap(i1, i2) {
const temp = this.heap[i1]
this.heap[i1] = this.heap[i2]
this.heap[i2] = temp
}
// 向上调整
shiftUp(index) {
// 元素下标为0,停止调整
if (index === 0) return
// 获取父元素下标
const parentIndex = this.getParentIndex(index)
// 如果当前元素比父元素小,交换值
if (this.heap[parentIndex] > this.heap[index]) {
this.swap(index, parentIndex)
// 递归
this.shiftUp(parentIndex)
}
}
// 向下调整
shiftDown(index) {
// 获取左右孩子下标
const left = this.getLeftIndex(index)
const right = this.getRightIndex(index)
// 如果左孩子比当前节点小,交换值
if (this.heap[index] > this.heap[left]) {
this.swap(index, left)
// 递归
this.shiftDown(left)
}
// 如果右孩子比当前节点小,交换值
if (this.heap[index] > this.heap[right]) {
this.swap(index, right)
// 递归
this.shiftDown(right)
}
}
// 向堆中插入元素
insert(n) {
this.heap.push(n)
// 从堆尾元素开始向上调整堆,使其成为最小堆
this.shiftUp(this.heap.length - 1)
}
// 删除堆顶
pop() {
// 将堆顶元素与堆尾元素交换
this.swap(0, this.heap.length - 1)
// 保存堆顶元素,作为函数返回值
const value = this.heap.pop()
// 从堆顶元素开始向下调整堆,使其成为最小堆
this.shiftDown(0)
// 返回删除的堆顶元素
return value
}
}
const h = new MinHeap()
h.insert(9)
h.insert(6)
h.insert(7)
h.insert(4)
h.insert(3)
h.insert(5)
h.insert(2)
h.insert(8)
h.insert(1)
console.log('heap', h.getHeap())
console.log('pop', h.pop())
console.log('heap', h.getHeap())
console.log('pop', h.pop())
console.log('heap', h.getHeap())
console.log('pop', h.pop())
console.log('heap', h.getHeap())
console.log('pop', h.pop())
console.log('heap', h.getHeap())

**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。