堆可以用数组模拟。假设堆顶在arr[1],那么任意节点 i 的左右子节点分别是 2i 和 2i+1,父节点是i/2.
堆具有以下性质:
大顶堆:arr[i] >= arr[2i] && arr[i] >= arr[2i+1] (i = 1,2…)
小顶堆:arr[i] <= arr[2i] && arr[i] <= arr[2i+1] (i = 1,2…)
push操作
思想:先把新元素插到堆的最后,然后自下而上,不断与父节点比较,让元素往上浮。
以大顶堆为例:
pop操作
思想:先用最后一个元素覆盖堆顶元素,然后再自上而下调整堆,将新的堆顶元素向下沉。
以大顶堆为例:每次选择两个子节点中的