08-heaps
Min-Heap Insert (Sift Up)
Insert one value into a min-heap and restore the parent-child order by sifting upward.
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 up
A new value starts at the end of the array and swaps with its parent while it is smaller.
Visual walkthrough
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![2, 4, 7, 9, 6]; heap_insert(&mut heap, 1); println!("{}", list_string(&heap)); }
Output
[1, 4, 2, 9, 6, 7]
Implementation notes
- The heap is a mutable
Vec<i32>created inmainand passed toheap_insert(heap: &mut Vec<i32>, value: i32), so the helper mutates the caller's vector in place and returns(). heap.push(value)appends1at the next array slot;childis ausizeindex initialized fromheap.len() - 1.- The parent index is computed as
(child - 1) / 2. Thewhile child > 0guard prevents subtracting from zero before that formula runs. - This is a min-heap:
if heap[parent] <= heap[child] { break; }stops when the parent is already no larger than the child. heap.swap(parent, child)exchanges vector elements in place, thenchild = parentcontinues the sift-up from the new position.- The trace shows
[2, 4, 7, 9, 6], append to[2, 4, 7, 9, 6, 1], swap with parent7to[2, 4, 1, 9, 6, 7], then swap with parent2to[1, 4, 2, 9, 6, 7]. list_string(&heap)borrows the vector as a slice, joins display-formatted integers, andprintln!("{}", ...)prints[1, 4, 2, 9, 6, 7].