8.2 建堆操作
使用一个列表的所有元素来构建一个堆——“建堆操作”。
- 创建一个空堆
- 遍历列表
- 元素依次入堆:将元素添加至尾部,再对元素执行“从底至顶”堆化
- 每当一个元素入堆,堆的长度就加一。
8.2.2 通过遍历堆化实现
建堆方法
- 将列表所有元素原封不动地添加到堆中,此时堆的性质尚未得到满足。
- 倒序遍历堆(层序遍历的倒序),依次对每个非叶节点执行“从顶至底堆化”。
/* 构造函数,根据切片建堆 */
MaxHeap *newMaxHeap(int nums[], int size) {
// 所有元素入堆
MaxHeap *maxHeap = (MaxHeap *)malloc(sizeof(MaxHeap));
maxHeap->size = size;
memcpy(maxHeap->data, nums, size * sizeof(int));
for (int i = parent(maxHeap, size - 1); i >= 0; i--) {
// 堆化除叶节点以外的其他所有节点
siftDown(maxHeap, i);
}
return maxHeap;
}
待学....