08-heaps
Min-Heap Pop (Sift Down)
Remove the minimum value, move the last item to the root, and sift downward.
Algorithm
Steps
- Store the heap in an array.
- Compare parent and child indexes instead of building explicit tree nodes.
- Swap only when the heap order is violated.
- Print the deterministic final heap state for replay comparison.
Complexity
- Time: O(log n)
- Space: O(1) extra
sift down
After removing the root, the last value moves to the root and swaps with the smaller child until order is restored.
Visual walkthrough
TypeScript DSA Implementation
basic.ts
function listString(values: number[]): string { return `[${values.join(", ")}]`; }
function heapInsert(heap: number[], value: number): void {
heap.push(value);
let child = heap.length - 1;
while (child > 0) {
const parent = Math.floor((child - 1) / 2);
if (heap[parent] <= heap[child]) break;
[heap[parent], heap[child]] = [heap[child], heap[parent]];
child = parent;
}
}
function heapPop(heap: number[]): number {
const smallest = heap[0];
heap[0] = heap.pop()!;
let parent = 0;
while (true) {
const left = parent * 2 + 1;
const right = left + 1;
if (left >= heap.length) break;
let child = left;
if (right < heap.length && heap[right] < heap[left]) child = right;
if (heap[parent] <= heap[child]) break;
[heap[parent], heap[child]] = [heap[child], heap[parent]];
parent = child;
}
return smallest;
}
const heap: number[] = [1, 4, 2, 9, 6, 7];
const popped = heapPop(heap);
console.log(`${popped} -> ${listString(heap)}`);
Output
1 -> [2, 4, 7, 9, 6]
Implementation notes
- In TypeScript,
heapPop(heap: number[]): numbermutates the caller'snumber[]; the sample heap is explicitly declared asconst heap: number[] = [1, 4, 2, 9, 6, 7]. const smallest = heap[0]stores the returned value, thenheap[0] = heap.pop()!removes the last element and writes it to the root. The non-null assertion matches the checked non-empty sample heap.- The sift-down loop computes children with
left = parent * 2 + 1andright = left + 1, chooses the smaller numeric child when the right child is in bounds, and stops whenheap[parent] <= heap[child]. - Swaps use destructuring assignment on two heap slots, then advance
parentto the child index. The trace shows[1, 4, 2, 9, 6, 7], root replacement to[7, 4, 2, 9, 6], then one swap with child2to[2, 4, 7, 9, 6]. - The final
console.logformats the popped value and heap as1 -> [2, 4, 7, 9, 6]. Visible allocation is the initial heap array and output string; mutation ispop, root assignment, and one in-place swap.