<!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())