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