跳转至

8.2   建堆操作

使用一个列表的所有元素来构建一个堆——“建堆操作”。

  1. 创建一个空堆
  2. 遍历列表
  3. 元素依次入堆:将元素添加至尾部,再对元素执行“从底至顶”堆化
  4. 每当一个元素入堆,堆的长度就加一。

8.2.2   通过遍历堆化实现

建堆方法

  1. 将列表所有元素原封不动地添加到堆中,此时堆的性质尚未得到满足。
  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;
}

待学....