给定一个初始序列,在此基础上建堆。每个序列号(从1开始)为i的节点左孩子为2i,右孩子为2i+1. 小顶堆即为每个以当前节点为根节点的子树中,最小的值总是根节点的值。因此根据迭代思想,当前节点的值(设为a),与左右两子树相比较,使最小的节点值(设为b)成为根节点,即可保证在当前子树中最小的值一定是根节点。因此堆的整体调整是由下向上的过程。 当节点a经过调整位置下沉后,需要进行后续调整直至找到合适的位置或者抵达序列边界为止。因此单个节点的调整是由上而下的过程。
另一种较为简便快速的建堆写法,即边输入边建堆: 单元调整由下往上,整体调整由上往下
void down_adjust(int x) { if (x == 1) { return; }; while (x > 1) { if (heap[x] < heap[x / 2]) { swap(x, x / 2); x = x / 2; } else { break; }; }; } void createheap(int n){ for (int i = 1; i <= n; i++) { cin >> heap[i]; down_adjust(i); }; }1,删除堆顶元素 即用堆的最后一个元素覆盖堆顶元素,再调整覆盖后根节点即可。调整完毕后序列规模减一。 2,向堆中添加一个元素 新添元素放在堆末尾,并将其向上调整一边。