Build Heap from Array Heapify in DSA C - Time & Space Complexity
We want to understand how long it takes to build a heap from an array using heapify.
How does the time needed grow as the array gets bigger?
Analyze the time complexity of the following code snippet.
void heapify(int arr[], int n, int i) {
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left] > arr[largest])
largest = left;
if (right < n && arr[right] > arr[largest])
largest = right;
if (largest != i) {
int temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
heapify(arr, n, largest);
}
}
void buildHeap(int arr[], int n) {
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(arr, n, i);
}
}
This code builds a max heap from an unsorted array by calling heapify on each non-leaf node.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The heapify function called on each node from the bottom up.
- How many times: The buildHeap loop runs about n/2 times, and each heapify can recurse down the tree.
Heapify runs faster on nodes near the bottom because they have less height to move down.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20-30 operations |
| 100 | About 300-400 operations |
| 1000 | About 4000-5000 operations |
Pattern observation: The total work grows a bit faster than linearly but much slower than n squared.
Time Complexity: O(n)
This means building a heap from an array takes time roughly proportional to the number of elements.
[X] Wrong: "Heapify runs in O(log n) for each node, so buildHeap is O(n log n)."
[OK] Correct: Most nodes are near the bottom and heapify runs faster there, so total time adds up to O(n), not O(n log n).
Knowing this time complexity helps you explain why heap construction is efficient and expected in many coding problems.
"What if we called heapify starting from the root only, repeatedly? How would the time complexity change?"
Practice
heapify process when building a heap from an array?Solution
Step 1: Understand heap property
A heap is a special tree where each parent node is greater (max-heap) or smaller (min-heap) than its children.Step 2: Role of heapify
Heapify rearranges elements so the heap property holds for every subtree, starting from the bottom.Final Answer:
To rearrange the array elements to satisfy the heap property -> Option DQuick Check:
Heapify = Rearrange for heap property [OK]
- Thinking heapify sorts the array
- Confusing heapify with finding max/min element
- Assuming heapify reverses the array
heapify on an array arr of size n starting from index i in C?Solution
Step 1: Understand heapify parameters
Heapify usually takes the array, its size, and the index to heapify from, in that order.Step 2: Match correct syntax
Callingheapify(arr, n, i);matches the standard parameter order: array, size, index.Final Answer:
heapify(arr, n, i); -> Option BQuick Check:
Function call order = arr, size, index [OK]
- Mixing parameter order
- Passing index before array
- Confusing size and index positions
arr = [4, 10, 3, 5, 1], what will be the array after calling heapify(arr, 5, 1) assuming a max-heap?Solution
Step 1: Identify children of index 1
Index 1 has children at indices 3 and 4 with values 5 and 1.Step 2: Compare and swap if needed
Value at index 1 is 10, which is greater than both children, so no swap needed.Final Answer:
[4, 10, 3, 5, 1] -> Option CQuick Check:
Parent >= children, no change [OK]
- Swapping when parent is already largest
- Mixing up child indices
- Assuming heapify sorts entire array
arr of size n. Identify the error:
for (int i = 0; i <= n/2; i++) {
heapify(arr, n, i);
}Solution
Step 1: Understand heap building order
Heap building starts from last non-leaf node at index n/2 - 1 down to 0.Step 2: Check loop direction and range
Loop incorrectly goes up from 0 to n/2, should go down from n/2 - 1 to 0.Final Answer:
Loop should start from n/2 - 1 and go down to 0 -> Option AQuick Check:
Build heap loops down from n/2-1 [OK]
- Looping forward instead of backward
- Starting loop at 0 without going down
- Incorrect heapify parameters
[3, 9, 2, 1, 4, 5]. After building a max heap using heapify from the bottom up, what is the final array?Solution
Step 1: Start heapify from last non-leaf node
Last non-leaf node index = n/2 - 1 = 2. Heapify at index 2: children 5 and no right child. Swap 2 and 5 -> [3,9,5,1,4,2]Step 2: Heapify at index 1
Index 1 value 9, children 1 and 4. 9 is largest, no swap -> [3,9,5,1,4,2]Step 3: Heapify at index 0
Index 0 value 3, children 9 and 5. Largest is 9 at index 1, swap -> [9,3,5,1,4,2]. Heapify at index 1 again: 3 with children 1 and 4, largest is 4 at index 4, swap -> [9,4,5,1,3,2]Final Answer:
[9, 4, 5, 1, 3, 2] -> Option AQuick Check:
Bottom-up heapify fixes subtree order [OK]
- Not heapifying children after swap
- Swapping with wrong child
- Stopping heapify too early
Ready to prove it?
Pass the test and this pattern moves unknown
