数据结构-堆Heap

一、堆的概念
堆逻辑上是一颗完全二叉树;
堆物理存储在数组中;
满足任意节点的值大于其子树的节点值称为大堆;任意节点的值小于其子树节点的值称为小堆;
堆的作用是:快速找到集合中的最值。
在这里插入图片描述

二、建堆、向下调整
下面我们给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算法,把它构建成一个堆。根节点左右子树不是堆,我们怎么调整呢?这里我们从倒数的第一个非叶子节点的子树开始调整,一直调整到根节点的树,就可以调整成堆。(大堆为例)
int[] arr={1,5,3,8,7,6}
在这里插入图片描述
调整之后
arr={8,7,6,5,3,1}
三、代码实现

//建大堆
public class Heap {
    public static void createHeap(int[] arr,int size){
        //从后向前遍历
        //向下调整
        for(int i=(size-1-1)/2;i>=0;i--){
            shiftDown(arr,size,i);
        }
    }

    private static void shiftDown(int[] arr, int size, int index) {
        int parent=index;
        int child=parent*2+1;
        while(child<size){
            if(child+1<size&&arr[child+1]>arr[child]){
                child=child+1;
            }
            if(arr[parent]<arr[child]){
                int tmp=arr[parent];
                arr[parent]=arr[child];
                arr[child]=tmp;
            }else{
                break;
            }
            parent=child;
            child=child*2+1;
        }
    }

    public static void main(String[] args) {
        int[] arr=new int[]{1,5,3,8,7,6};
        createHeap(arr,arr.length);
        System.out.println(Arrays.toString(arr));

    }
}

猜你喜欢

转载自blog.csdn.net/Subuprogrammer/article/details/107863776