一、堆的定义
堆的数据结构是一个数组,对于数组中任意节点i,其值小于节点2i和2i+1的值,则称该数组是一个小顶堆。
二、建堆注意事项
1、数组从下标1开始存放数据,可以简化程序逻辑,i/2即是i的父亲节点。
2、建堆时,从最末叶子节点开始往前遍历,调整每个节点所在的子树,使其满足堆的定义,由于叶子节点本身肯定满足堆定义,实际只需要从最末叶子节点的父亲节点开始即可。
三、调整堆
1、对于根、左子树、右子树而言,如果根比其中一个子树节点小,则将根与子树中最小的节点交换。交换之后有可能导致被交换的子树不符合堆定义,需要递归的进行调整,直到叶子节点或者某次比较没有节点交换,即完成调整。
四、堆排序
堆排序的过程如下:
1、建堆:n/2*logn
2、取堆顶作为排序结果的第一个元素,将最末叶子节点换到根节点,重新调整堆,使其满足定义;
3、重复步骤2,直到堆中没有元素。