算法系列-堆

44 阅读1分钟

是一种特殊的完全二叉树。所有的节点都大于等于(最大堆)或小于等于(最小堆)它的子节点。由于的特殊结构,我们可以用数组表示


js

复制代码

1

/ \

2 3

/ \ /\

4 5 6

  


// 数组表示堆结构

const heap = [1, 2, 3, 4, 5, 6]

  


// 实现一个最小堆类

class MinHeap {

constructor() {

this.heap = [];

}

swap(i1, i2) {

const temp = this.heap[i1];

this.heap[i1] = this.heap[i2];

this.heap[i2] = temp;

}

getParentIndex(i) {

return (i - 1) >> 1;

}

getLeftIndex(i) {

return i * 2 + 1;

}

getRightIndex(i) {

return i * 2 + 2;

}

shiftUp(index) {

if (index == 0) { return; }

const parentIndex = this.getParentIndex(index);

if (this.heap[parentIndex] > this.heap[index]) {

this.swap(parentIndex, index);

this.shiftUp(parentIndex);

}

}

shiftDown(index) {

const leftIndex = this.getLeftIndex(index);

const rightIndex = this.getRightIndex(index);

if (this.heap[leftIndex] < this.heap[index]) {

this.swap(leftIndex, index);

this.shiftDown(leftIndex);

}

if (this.heap[rightIndex] < this.heap[index]) {

this.swap(rightIndex, index);

this.shiftDown(rightIndex);

}

}

insert(value) {

this.heap.push(value);

this.shiftUp(this.heap.length - 1);

}

pop() {

this.heap[0] = this.heap.pop();

this.shiftDown(0);

}

peek() {

return this.heap[0];

}

size() {

return this.heap.length;

}

}

  


const h = new MinHeap();

h.insert(3);

h.insert(2);

h.insert(1);

h.pop();

使用场景

  • 场景:leetcode 刷题

LeetCode 题目