# 对元素数为 N 的数组 A 构建堆
buildHeap(A):
    for i ← N/2 - 1 downto 0:
        downHeap(A, i)

# 对元素数为 N 的数组 A 表示的堆的节点 i 进行向下调整堆
# 基于插入的实现
downHeap(A, i): 
    largest       # 保存值最大的节点
    cur ← i;     # 当前节点
    val ← A[i]   # 临时保存起点的值

    while True:
        # 找到值最大的节点
        if left(cur) < N and right(cur) < N:  
            # 如果有左右子节点
            if A[left(cur)] > A[right(cur)]:
                largest ← left(cur)
            else:
                largest ← right(cur)
        else if left(cur) < N:                  
            largest ← left(cur)   # 如果只有左子节点
        else if right(cur) < N:
            largest ← right(cur)  # 如果只有右子节点
        else:
            largest ← NIL

        if largest = NIL: break         # 如果 cur 为叶子节点,结束处理
        if A[largest] ≤ val: break     # 如果小于起点的值,结束处理
      
        A[cur] ← A[largest]
        cur ← largest      # 下降到原来的大值的位置

    A[cur] ← val # 将起点的值放入插入位置