Sift-up on push

void push(int val) {
  heap[size] = val;
  int i = size++;
  while (i > 0) {
    int p = (i - 1) / 2;
    if (heap[p] > heap[i]) { swap(p, i); i = p; }
    else break;
  }
}
Advertisement

Sift-down on pop

int pop() {
  int min = heap[0];
  heap[0] = heap[--size];
  int i = 0;
  while (true) {
    int l = 2*i+1, r = 2*i+2, small = i;
    if (l < size && heap[l] < heap[small]) small = l;
    if (r < size && heap[r] < heap[small]) small = r;
    if (small == i) break;
    swap(i, small); i = small;
  }
  return min;
}
Advertisement

Build heap in O(N)

Insert one-by-one is O(N log N). Sift down starting from bottom is O(N). Non-obvious math!

Heap sort

Build max heap + repeatedly extract max = sorted order. O(N log N) in-place.