堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
既然是堆排序,自然需要先建立一个堆,而建堆的核心内容是调整堆,使二叉树满足堆的定义(每个节点的值都不大于其父节点的值)。调堆的过程应该从最后一个非叶子节点开始,假设有数组a[] ={16,7,3,20,17,8}。那么调堆的过程如下图,数组下标从0开始,a[2] = 8开始。分别与左孩子和右孩子比较大小,如果a[2]最大,则不用调整,否则和孩子中的值最大的一个交换位置。
以上便是建堆的完整过程,主要总结有以下几点需要注意:
1.首先将所有元素按照初始顺序逐层填充到一个完全二叉树中
2.从“最后一个非终端节点”开始,调用MAX-HEAPIFY方法,调整堆的结构,直到根节点为止
接下来通过最大堆将输入数组排序,最大堆构建完成后我们将堆顶元素和堆的最后一个节点元素交换,这样堆的最后一个节点就是堆的最大值,同时将堆的大小减1,并继续调整二叉树使其满足最大堆的特性。重复此步骤,最后的输入数组就是排序的了。