堆(heap)又被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队列。 因为队列中允许的操作是先进先出(FIFO),在队尾插入元素,在队头取出元素。 而堆虽然在堆底插入元素,在堆顶取出元素,但是堆中元素的排列不是按照到来的先后顺序,而是按照一定的优先顺序排列的。
本文着重讲解最大堆,最小堆以及堆排序
堆的一个经典的实现是完全二叉树(complete binary tree),这样实现的堆称为二叉堆(binary heap)。
满二叉树:除了叶子节点,所有的节点的左右孩子都不为空,就是一棵满二叉树,如下:
7
/ \
2 5
/ \ / \
13 24 12 56
完全二叉树:不一定是一个满二叉树,但它不满的那部分一定在右下侧,如下
7
/ \
2 5
/ \ /
13 24 12
堆的特性: 必须是完全二叉树;任一结点的值是其子树所有结点的最大值或最小值