import java.util.NoSuchElementException;
public class MaxHeap<Type> {
private Type[] elements;
private int size;
private static final int Default_size = 10;
public MaxHeap() {
elements = (Type[]) new Object[Default_size];
size = 0;
}
public MaxHeap(int sz) {
elements = (Type[]) new Object[sz];
size = 0;
}
public MaxHeap(Type[] data) {
elements = data;
size = data.length;
for (int i = parent(size - 1); i >= 0; i--) {
floatDown(i);
}
}
public void clear() {
size = 0;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
private int parent(int index) {
if (index == 0) {
throw new IllegalArgumentException("该节点为根节点");
}
return (index - 1) / 2;
}
private int leftChild(int index) {
return index * 2 + 1;
}
private int rightChild(int index) {
return index * 2 + 2;
}
public void add(Type val) {
if (elements.length == size) {
Type[] old = elements;
elements = (Type[]) new Object[size * 2];
for (int i = 0; i < size; i++) {
elements[i] = old[i];
}
}
elements[size] = val;
size++;
floatUp(size - 1);
}
private void floatUp(int index) {
while (index > 0 && 0 > elements[parent(index)].toString()
.compareTo(elements[index].toString())) {
Type t = elements[parent(index)];
elements[parent(index)] = elements[index];
elements[index] = t;
index = parent(index);
}
}
public Type extractMax() {
if (size == 0) {
throw new NoSuchElementException();
}
Type max = elements[0];
elements[0] = elements[size - 1];
size--;
floatDown(0);
return max;
}
private void floatDown(int index) {
while (leftChild(index) < size) {
int temp = leftChild(index);
if (rightChild(index) < size && 0 >
elements[leftChild(index)].toString().compareTo(
elements[rightChild(index)].toString())) {
temp++;
}
if (0 < elements[temp].toString()
.compareTo(elements[index].toString())) {
Type t = elements[index];
elements[index] = elements[temp];
elements[temp] = t;
index = temp;
} else {
break;
}
}
}
public Type replace(Type val) {
if (size == 0) {
throw new NoSuchElementException();
}
Type max = elements[0];
elements[0] = val;
floatDown(0);
return max;
}
}