一 : 堆
什么是堆?
堆可以理解成一个完全二叉树
只不过堆是以数组的形式表现出来的
满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆4. 反之,则是小堆,或者小根堆,或者最小堆。
大堆与小堆可以用于筛选数组之中最大值或是最小值,
比如在千万级别的数据中找到前五个最大的值,那么就要建立一个有五个元素的小堆,每一次筛选,如果筛选的元素比堆顶就找到堆顶最小的元素将其换下来
那么怎么进行堆的排序呢?
有向上调整和向下调整
如果是一个不规则的堆,那么就要从最后一个非叶子节点向下调整
这里以大堆举例
public static void shiftDownBig(int[] arr, int sz, int parent){
int child = 2 * parent + 1; // left child
// 从parent节点开始,一直调整到叶子节点结束
while(child < sz){
//right child : child + 1 从两个孩子节点中选一个最大的
if(child + 1 < sz && arr[child + 1] > arr[child]){
++child;
}
if(arr[child] > arr[parent]){
//如果child 大于 parent, 向下调整,交换值
swap(arr, child, parent);
//更新,继续向下调整