代码 - 已有元素建堆、添加元素到堆里并调整、删除堆顶并调整

class Solution {
    //建堆、调整为大顶堆、删除堆顶并调整回大堆顶,往堆里添加元素并调整堆
    public void buildMaxHeap(int[] nums,int size){
        for (int i=size/2-1;i>=0;i--){
            heapifyDown(i,nums,size);
        }
    }
    public void addEle(int[] nums,int ele){
        //数组容量不够要扩容,这里假装是够的
        int size=nums.length;
        nums[size]=ele;
        heapifyUp(size,nums);
    }
    /**换上去的都是大于两个子节点的,被换下来的也一定大于两个子节点,因为它原本大于这两个子节点的父节点,所以不需要像heapifyDown一样,去调整换下去的,只需要一直往上up*/
    public void heapifyUp(int i,int[] nums){
        int index=(i-1)/2;
        if (index>=0 && nums[i]>nums[index]){
            swap(nums,i,index);
            heapifyUp(index,nums);
        }
    }
    public void removeTop(int[] nums,int size){
        swap(nums,0,size-1);
        //先自减 再传参
        heapifyDown(0,nums,--size);
    }
    public void heapifyDown(int i,int[] nums,int heapSize){
        //找到i节点的两个子节点,比较大小
        int left=i*2+1,right=i*2+2,largestIndex=i;

        // if (leftnums[i]){
        //     //交换
        //     swap(nums,left,i);
        //     largestIndex=left;
        // }
        // if (rightnums[i]){
        //     //交换
        //     swap(nums,right,i);
        //     largestIndex=right;
        // }
        // 如果像上面那样 可能顶的左右子节点都改变了,那么两边子节点为顶的堆都可能要调整
        if (left<heapSize && nums[left]>nums[largestIndex]){
            largestIndex=left;
        }
        if (right<heapSize && nums[right]>nums[largestIndex]){
            largestIndex=right;
        }
        //递归终止条件 就是顶没有被换下去
        if (largestIndex!=i){
            //交换
            swap(nums,largestIndex,i);
            //现在最大的到顶点了,要接着调整被换下去的子堆
            heapifyDown(largestIndex,nums,heapSize);
        }
    }
    public void swap(int[] nums,int index1,int index2){
        int tmp=nums[index1];
        nums[index1]=nums[index2];
        nums[index2]=tmp;
    }
}

你可能感兴趣的:(JAVA笔记,算法,数据结构,java)