JAVA 根排序 大根堆

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;
    }
}
原文地址:https://www.cnblogs.com/glory-jzx/p/13667296.html