《算法通关村——原来这就是堆》

《算法通关村——原来这就是堆》

理解最大堆: 最大堆就是父节点一定比子节点都要大所以就形成了,自然而然根节点就是最大的值了。

如果在最大堆中要插入值得话,那么就需要把值插入到最后,然后一步一步得走上去,也就是和父节点对比,如果大了,就交换,不大就直接停止了。
《算法通关村——原来这就是堆》_第1张图片

如果要删除值的话,都是删除最顶端的值,然后把最低端的值拿上来,然后再把这个顶端的值往下面走,如果有比这个值大的就交换(要和子结点中最大的交换),这样就能保证堆的结构不变。
《算法通关村——原来这就是堆》_第2张图片

最大堆的实现(这样子实现只能是值一个一个的插入,才能保证是最大堆,没有办法直接多个插入,如果想多个插入,再建一个构造函数,然后用insert插入就好了。):

package Algorithm14;

public class MaxHeap {
    private int[] heap;
    private int size;

    public MaxHeap(int capacity) {
        heap = new int[capacity];
        size = 0;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public boolean isFull() {
        return size == heap.length;
    }

    public void insert(int value) throws IllegalStateException {
        if (isFull()) {
            throw new IllegalStateException("Heap is full");
        }

        heap[size] = value;
        bubbleUp(size);
        size++;
    }

    private void bubbleUp(int index) {
        while (index > 0) {
            int parent = (index - 1) / 2;
            if (heap[parent] < heap[index]) {
                swap(parent, index);
                index = parent;
            } else {
                break;
            }
        }
    }

    public int removeMax() throws IllegalStateException {
        if (isEmpty()) {
            throw new IllegalStateException("Heap is empty");
        }

        int max = heap[0];
        heap[0] = heap[size - 1];
        size--;
        bubbleDown(0);
        return max;
    }

    private void bubbleDown(int index) {
        while (true) {
            int child1 = 2 * index + 1;
            if (child1 >= size) {
                break;
            }
            int child2 = child1 + 1;
            int largest = child1;
            if (child2 < size && heap[child2] > heap[largest]) {
                largest = child2;
            }
            if (heap[index] >= heap[largest]) {
                break;
            } else {
                swap(index, largest);
                index = largest;
            }
        }
    }

    private void swap(int i, int j) {
        int temp = heap[i];
        heap[i] = heap[j];
        heap[j] = temp;
    }
}

点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?

也可以加我QQ(2837468248)咨询说明来意!

你可能感兴趣的:(算法学习,算法)