Heapify
最后更新于:2022-04-02 01:14:02
# Heapify
### Source
- lintcode: [(130) Heapify](http://www.lintcode.com/en/problem/heapify/)
~~~
Given an integer array, heapify it into a min-heap array.
For a heap array A, A[0] is the root of heap, and for each A[i],
A[i * 2 + 1] is the left child of A[i] and A[i * 2 + 2] is the right child of A[i].
Example
Given [3,2,1,4,5], return [1,2,3,4,5] or any legal heap array.
Challenge
O(n) time complexity
Clarification
What is heap?
Heap is a data structure, which usually have three methods: push, pop and top.
where "push" add a new element the heap,
"pop" delete the minimum/maximum element in the heap,
"top" return the minimum/maximum element.
What is heapify?
Convert an unordered integer array into a heap array.
If it is min-heap, for each element A[i],
we will get A[i * 2 + 1] >= A[i] and A[i * 2 + 2] >= A[i].
What if there is a lot of solutions?
Return any of them.
~~~
### 题解
参考前文提到的 [Heap Sort](http://algorithm.yuanbin.me/zh-cn/basics_sorting/heap_sort.html) 可知此题要实现的只是小根堆的堆化过程,并不要求堆排。
### C++
~~~
class Solution {
public:
/**
* @param A: Given an integer array
* @return: void
*/
void heapify(vector &A) {
// build min heap
for (int i = A.size() / 2; i >= 0; --i) {
min_heap(A, i);
}
}
private:
void min_heap(vector &nums, int k) {
int len = nums.size();
while (k < len) {
int min_index = k;
// left leaf node search
if (k * 2 + 1 < len && nums[k * 2 + 1] < nums[min_index]) {
min_index = k * 2 + 1;
}
// right leaf node search
if (k * 2 + 2 < len && nums[k * 2 + 2] < nums[min_index]) {
min_index = k * 2 + 2;
}
if (k == min_index) {
break;
}
// swap with the minimal
int temp = nums[k];
nums[k] = nums[min_index];
nums[min_index] = temp;
// not only current index
k = min_index;
}
}
};
~~~
### 源码分析
堆排的简化版,最后一步`k = min_index`不能忘,因为增删节点时需要重新建堆,这样才能保证到第一个节点时数组已经是二叉堆。
### 复杂度分析
由于采用的是自底向上的建堆方式,时间复杂度为 (N)(N)(N), 证明待补充...
### Reference
- [Heap Sort](http://algorithm.yuanbin.me/zh-cn/basics_sorting/heap_sort.html)
- [Heapify 参考程序 Java/C++/Python](http://www.jiuzhang.com/solutions/heapify/)
';