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. @end @complexity
- Time: O(log n)
- Space: O(1) extra @end
sift down
After removing the root, the last value moves to the root and swaps with the smaller child until order is restored.
Rust DSA Implementation
basic.rs
fn list_string(values: &[i32]) -> String {
format!("[{}]", values.iter().map(|v| v.to_string()).collect::<Vec<_>>().join(", "))
}
fn heap_insert(heap: &mut Vec<i32>, value: i32) {
heap.push(value);
let mut child = heap.len() - 1;
while child > 0 {
let parent = (child - 1) / 2;
if heap[parent] <= heap[child] { break; }
heap.swap(parent, child);
child = parent;
}
}
fn heap_pop(heap: &mut Vec<i32>) -> i32 {
let smallest = heap[0];
let last = heap.pop().unwrap();
heap[0] = last;
let mut parent = 0;
loop {
let left = parent * 2 + 1;
let right = left + 1;
if left >= heap.len() { break; }
let mut child = left;
if right < heap.len() && heap[right] < heap[left] { child = right; }
if heap[parent] <= heap[child] { break; }
heap.swap(parent, child);
parent = child;
}
smallest
}
fn main() { let mut heap = vec![1, 4, 2, 9, 6, 7]; let popped = heap_pop(&mut heap); println!("{} -> {}", popped, list_string(&heap)); }
@end @output 1 -> [2, 4, 7, 9, 6] @end