package bio.pih.genoogle.util;
import java.util.Comparator;
public class BinaryHeap<T> {
private final Comparator<T> comparator;
private final T[] data;
private int freePos;
@SuppressWarnings("unchecked")
public BinaryHeap(int size, Comparator<T> comparator) {
this.comparator = comparator;
this.data = (T[]) new Object[size];
this.freePos = 0;
}
public void add(T t) {
if (freePos == data.length) {
// TODO: re arrange/increase?
throw new RuntimeException("Too much data in the Binary Heap");
}
data[freePos] = t;
freePos++;
for (int i = freePos-1; i > 0;) {
int parent = (int)((i-1)/2);
if (comparator.compare(data[i], data[parent]) < 0) {
T swap = data[i];
data[i] = data[parent];
data[parent] = swap;
}
i = parent;
}
}
private void heapify(final int i) {
if (i > freePos-1) {
return;
}
final int left = (i + 1) * 2 -1;
final int right = (i + 1)* 2;
int minidx = i;
if (left < freePos && comparator.compare(data[left], data[i]) < 0) {
minidx = left;
}
if (right < freePos && comparator.compare(data[right], data[i]) < 0 && comparator.compare(data[right], data[left]) < 0) {
minidx= right;
}
if (minidx != i) {
T swap = data[i];
data[i] = data[minidx];
data[minidx] = swap;
heapify(minidx);
}
}
public T top() {
if (freePos == 0) {
return null;
}
return data[0];
}
public T switchTop(T t) {
T v;
if (freePos == 0) {
v = null;
} else {
v = data[0];
}
data[0] = t;
heapify(0);
return v;
}
public T removeTop() {
if (freePos == 0) {
return null;
}
T top = data[0];
data[0] = data[freePos-1] ;
data[freePos-1] = null;
freePos--;
heapify(0);
return top;
}
public boolean isEmpty() {
return freePos == 0;
}
public static void xx(String[] args) {
Comparator<Integer> c = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
};
BinaryHeap<Integer> bh = new BinaryHeap<Integer>(10, c);
bh.add(7);
bh.add(6);
bh.add(8);
bh.add(10);
bh.add(4);
bh.add(1);
bh.add(9);
bh.add(2);
bh.add(3);
bh.add(5);
System.out.println(bh.switchTop(11));
System.out.println(bh.switchTop(1));
System.out.println(bh.switchTop(5));
System.out.println(bh.switchTop(8));
System.out.println(bh.switchTop(9));
System.out.println(bh.switchTop(51));
System.out.println(bh.switchTop(5));
System.out.println(bh.removeTop());
System.out.println(bh.removeTop());
System.out.println(bh.removeTop());
System.out.println(bh.removeTop());
System.out.println(bh.removeTop());
System.out.println(bh.removeTop());
System.out.println(bh.removeTop());
System.out.println(bh.removeTop());
System.out.println(bh.removeTop());
System.out.println(bh.removeTop());
}
}