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
Swift DSA Implementation
basic.swift
func listString(_ values: [Int]) -> String { "[" + values.map(String.init).joined(separator: ", ") + "]" }
func heapInsert(_ heap: inout [Int], _ value: Int) {
heap.append(value)
var child = heap.count - 1
while child > 0 {
let parent = (child - 1) / 2
if heap[parent] <= heap[child] { break }
heap.swapAt(parent, child)
child = parent
}
}
func heapPop(_ heap: inout [Int]) -> Int {
let smallest = heap[0]
heap[0] = heap.removeLast()
var parent = 0
while true {
let left = parent * 2 + 1
let right = left + 1
if left >= heap.count { break }
var child = left
if right < heap.count && heap[right] < heap[left] { child = right }
if heap[parent] <= heap[child] { break }
heap.swapAt(parent, child)
parent = child
}
return smallest
}
var heap = [1, 4, 2, 9, 6, 7]
let popped = heapPop(&heap)
print("\(popped) -> \(listString(heap))")
Implementation notes
var heap = [1, 4, 2, 9, 6, 7]is a mutable Swift[Int]representing a min-heap in array layout.heapPop(_ heap: inout [Int]) -> Intmutates the caller's array and returns the removed minimum.let smallest = heap[0]saves the root value, thenheap[0] = heap.removeLast()moves the last element into the root slot while shrinking the array.- Sift-down starts with
var parent = 0and computes children asleft = parent * 2 + 1andright = left + 1. - The loop breaks when
left >= heap.count, meaning the parent has no children. var child = leftpicks the left child first; if the right child exists andheap[right] < heap[left], the right child becomes the smaller child.- The min-heap condition
heap[parent] <= heap[child]stops the loop; otherwiseheap.swapAt(parent, child)restores one level and movesparent = child. - The trace starts at
[1, 4, 2, 9, 6, 7], removes1, moves7to get[7, 4, 2, 9, 6], then swaps7with smaller child2for[2, 4, 7, 9, 6]. let popped = heapPop(&heap)is printed withlistString(heap), producing1 -> [2, 4, 7, 9, 6].
Output
1 -> [2, 4, 7, 9, 6]