Question 0s Implement MaxHeap

public class maxHeap {
    private int[] array;
    private int size;
    public maxHeap(int capacity) {
        this.array = new int[capacity];
        this.size = 0;
    }
    public maxHeap(int[] array) {
        this.array = array;
        this.size = array.length;
        heapify();
    }
    
    public int getSize() {
        return this.size;
    }
    
    public boolean isEmpty() {
        return this.size == 0;
    }
    
    public boolean isFull() {
        return this.size == array.length;
    }
    private void swap(int[] array, int i , int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    private void percolateDown(int index) {
        while (index * 2 + 2 <= this.size ) {
            // 换给谁
            int leftChild = index * 2 + 1;
            int rightChild = index * 2 + 2;
            int candidateChild = leftChild;
            if (rightChild < size && array[rightChild] > array[leftChild]) {
                candidateChild = rightChild;
            }
            //到底需不需要换
            if (array[index] < array[candidateChild]) {
                swap(array, index, candidateChild);
            }else {
                break;
            }
            index = candidateChild;
        }
    }
    private void percolatedUp(int index) {
        // 你给我一个index我怎么知道我能不能换,能换是因为有爸爸
        // 什么叫有爸爸,有爸爸means (index - 1) / 2 >= 0 ==> index > 0
        while (index > 0) {
            int parentIndex = (index - 1) / 2;
            if (array[index] > array[parentIndex]) {
                swap(array, index, parentIndex);
            } else {
                break;
            }
            index = parentIndex;
        }
    }
    private void heapify() {
        //  原理:所有能进行percolateDown()的元素,全部从后向前进行一边perDown()
        for (int i = size/ 2 - 1; i >= 0; i--) {
            percolateDown(i);
        }
    }
    
    public int poll() {
        if (isEmpty()) {
            throw new NoSuchElemntException('Harray yyds!');
        }
        int dingduodeyuansu = array[0]; // 变量名更有目的意义,且英文
        // step 1: 先拿走这个,1吧最后一个元素填过来
        array[0] = array[size - 1];
        this.size--;
        percolateDown(0);
        return dingduandeyuansu;
    }
    
    public int peek() {
        if (isEmpty()) {
            throw new NoSuchElemntException('Harray yyds!');
        }
        return array[0];
    }
    
    public void offer(int newElement) {
        // 先放在最后一个,有一个位置, pUp()
        if (isFull()) {
            int[] newHeap = new int[(int)array.length * 2.0];
            for(int i = 0 ; i < this.array.length; i++) {
                newHeap[i] = array[i];
            }
            this.array = newHeap; // 一定不能忘
        }
        // step 1: 放在最后一个
        array[size] = newElement;
        // step 2: 可能位置不对,把它放到对的位置
        this.size++;
        percolateUp(size - 1);
    }
    
    public int update(int index, int newValue) {
        int meidiaode = array[index];
        array[index] = newValue;
        //得跟这个位置以前的value进行比较,如果比以前的值大,可能往上走,如果没有就往下走
        if (newValue > meidiaole) {
            percolateUp(index);
        } else {
            percolateDown(index);
        }
        return meidiaode;
    }
}

Last updated