package sort;
import java.util.Arrays;
public class MaxHeap<T> {
private T[] arr;
private int count;
private int heapCapacity;
public MaxHeap()
{
heapCapacity=64;
count =0;
arr = (T[]) new Object[heapCapacity];
}
public MaxHeap(T[] tin)
{
heapCapacity=tin.length+1;
count =tin.length;
arr = (T[]) new Object[heapCapacity];
System.arraycopy(tin,0,arr,1,count);
for (int i = count/2; i >0 ; i--) {
shiftDown(i);
}
}
public MaxHeap(int capacity)
{
heapCapacity=capacity;
count =0;
arr = (T[]) new Object[capacity];
}
public boolean compare(T object,T valueOfZNode){
//最大堆和最小堆 可以直接修改该方法实现
if((object instanceof Integer)){
return (Integer)object<=(Integer)valueOfZNode;
}else if(object instanceof Double){
return (Double)object<=(Double) valueOfZNode;
}else{
return false;
}
}
public void insert(T t)
{
doubleCapacity();
arr[++count] = t;
shiftUp(count);
}
public T pop()
{
T t= arr[1];
arr[1]=arr[count--];
shiftDown(1);
return t;
}
private void shiftUp(int k)
{
while(k>1 && !compare(arr[k],arr[k/2]))
{
arr[0]=arr[k];
arr[k]=arr[k/2];
arr[k/2]=arr[0];
k/=2;
}
}
public void shiftDown(int k)
{
while (k*2<=count)
{
if(!compare(arr[k],arr[k*2]))
{
break;
}
if(k*2 == count)
{
arr[0]=arr[k];
arr[k]=arr[k*2];
arr[k*2]=arr[0];
break;
}
if(!compare(arr[k*2],arr[k*2+1]))
{
arr[0]=arr[k];
arr[k]=arr[k*2];
arr[k*2]=arr[0];
k=k*2;
}
else
{
arr[0]=arr[k];
arr[k]=arr[k*2+1];
arr[k*2+1]=arr[0];
k=k*2+1;
}
}
}
private void doubleCapacity()
{
if(count+1 < heapCapacity) return;
arr = Arrays.copyOf(arr,2*arr.length);
}
public static void main(String[] args)
{
Integer[] arrTemp = {1,23,5,45,25,34,15,37,46,6,849,4,57,31,86,74,32,374,498,876,221,334,81,49,39,231,8,2,321,3,51};
MaxHeap<Integer> maxHeap =new MaxHeap(arrTemp);
System.out.println(maxHeap.pop());
System.out.println(maxHeap.pop());
System.out.println(maxHeap.pop());
System.out.println(maxHeap.pop());
System.out.println(maxHeap.pop());
System.out.println(maxHeap.pop());
System.out.println(maxHeap.pop());
System.out.println(maxHeap.pop());
System.out.println(maxHeap.pop());
System.out.println(maxHeap.pop());
System.out.println(maxHeap.pop());
}
//完全二叉树的叶子节点为 数组数量/2+1 之后的所有节点
}