最小堆




    
    最小堆类


    

最小堆类

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

最小堆_第1张图片

你可能感兴趣的:(最小堆)