直接回答
堆是一棵完全二叉树,满足堆序性质:最大堆中每个节点都不小于其子节点,根为最大值。工程上用数组存储,节点 i 的左右孩子为 2i+1、2i+2。优先队列直接用堆实现:入队时追加到末尾再上浮,出队时取堆顶、用末尾元素补位再下沉,两操作均 O(log n)。
展开解析
上浮(sift-up):新元素与父节点比较,违反堆序就交换,直至根部。下沉(sift-down):与较大的孩子交换向下,直至叶子。数组存堆的妙处是完全二叉树无需指针、缓存友好。建堆有技巧:自底向上对所有非叶节点做一次下沉是 O(n),优于逐个插入的 O(n log n)——这是常见追问点。堆顶 O(1) 查询但删除任意元素需先定位,非堆所长。应用:优先队列、堆排序、Top K、合并 K 个有序序列、任务调度。易错点:下标从 0 还是从 1 开始的父子公式不一致;比较器写反得到相反方向的堆。语言内置:Python heapq 是最小堆,Java PriorityQueue 默认最小堆。
示例
索引 i:父 (i-1)//2,左子 2i+1,右子 2i+2。push 上浮,pop 用末尾补根后下沉。