public class Test { public static void main(String[] args) { Heap<Integer> myHeap = new Heap<>( 10 ,Integer.class); Integer[] integers = {5, 6, 7, 1, 2, 100, 101,96, 200,64}; for (Integer integer : integers) { myHeap.insert(integer); } System.out.println(myHeap.getTop()); myHeap.removeTop(); System.out.println(myHeap.getTop()); myHeap.removeTop(); System.out.println(myHeap.getTop()); } } class Heap<T extends Comparable>{ private T[] arr; private int size; private int maxSize; public Heap(int maxSize , Class<T> tClass) { this.maxSize = maxSize; this.arr = (T[])Array.newInstance(tClass, maxSize); } public void insert(T t ){ arr[size] = t; update(size); size++; } public T getTop(){ return arr[0]; } static private int getLeft (int i ){ return i*2 + 1; } static private int getRight( int i ){ return i*2 + 2; } public void update( int idx ){ if(idx == 0 ) return; int parentIdx = (idx - 1) /2 ; if( arr[parentIdx].compareTo(arr[idx]) < 0 ){ T temp = arr[idx]; arr[idx] = arr[parentIdx]; arr[parentIdx] = temp; update(parentIdx); } } public T removeTop(){ T top = arr[0]; arr[0] = arr[size-1]; heapify(arr, 0 ); size--; return top; } public T[] heapify(T[] arr, int i){ int leftIdx = getLeft(i); int rightIdx = getRight(i); int largest = i; if( leftIdx < arr.length && arr[i].compareTo(arr[leftIdx]) < 0 ){ largest = leftIdx; } if( rightIdx < arr.length && arr[largest].compareTo(arr[rightIdx]) < 0 ){ largest = rightIdx; } if( largest != i ){ T temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; heapify( arr, largest ); } return arr; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } }