The public methods provided are :

size();

isEmpty();

isFull();

peek();

poll();

offer();

update(int index, int value);

package edu.neu.ranchen.algorithm;

import java.util.NoSuchElementException;

/**
 * Created by FredChen on 1/24/17.
 */

public class MinHeap {
    private int[] array;
    private int size;

    public MinHeap(int[] array) {
        if (array == null || array.length == 0) {
            throw new IllegalArgumentException("input array can not be null or empty");
        }
        this.array = array;
        this.size = array.length;
        heapify();
    }

    public MinHeap(int cap) {
        if (cap <= 0) {
            throw new IllegalArgumentException("input size can not be <= 0");
        }
        this.array = new int[cap];
        this.size = 0;
    }

    private void heapify() {
        for (int i = size / 2 - 1; i >= 0; i--) {
            percolateDown(i);
        }
    }

    private void percolateDown(int index) {
        while(index <= size / 2 - 1) {
            int leftIndex= index * 2 + 1;
            int rightIndex= index * 2 + 2;
            int swapIndex = leftIndex;

            if (rightIndex <= size - 1 && array[rightIndex] < array[leftIndex]) {
                swapIndex = rightIndex;
            }
            if (array[index] > array[swapIndex]) {
                swap(array, index, swapIndex);
            } else {
                break;
            }
            index = swapIndex;
        }
    }

    private  void percolateUp(int index) {
        while (index > 0) {
            int parentIndex = (index - 1) / 2;
            if (array[parentIndex] > array[index]) {
                swap(array, parentIndex, index);
            } else {
                break;
            }
            index = parentIndex;
        }
    }

    private void swap(int[] array, int left, int right) {
        int temp = array[left];
        array[left] = array[right];
        array[right] = temp;
    }

    public int size() {
        return this.size;
    }

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

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

    public int poll() {
        if (size == 0) {
            throw new NoSuchElementException("heap is empty");
        }
        int result = array[0];
        array[0] = array[size - 1];
        size--;
        percolateDown(0);
        return result;
    }

    public void offer(int ele) {
        if (size == array.length) {
            resize();
        }
        array[size] = ele;
        size++;
        percolateUp(size - 1);
    }

    public int update (int index, int ele) {
        if (index < 0 || index > size - 1) {
            throw new ArrayIndexOutOfBoundsException("Invalid Index Range");
        }
        int result = array[index];
        array[index] = ele;
        if (ele > result) {
            percolateDown(index);
        } else {
            percolateUp(index);
        }
        return result;
    }

    public int peek() {
        if (array.length == 0) {
            throw new NoSuchElementException("heap is Empty");
        }
        if (size == 0) {
            return -1;
        }
        return array[0];
    }

    private void resize() {
        int[] newArray = new int[array.length * 2];
        System.arraycopy(array, 0, newArray,0,array.length);
        this.array = newArray;
    }
}

Notice: percolateDown and percolateUp 的写法, 以及什么时候会用到percolateDown & percolateUp。 offer : percolateUp。 poll: percolateDown。 update: depends the element。 heapify: percolateDown

results matching ""

    No results matching ""