• 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;
        }
    }
  • 相关阅读:
    SpringBoot
    JS
    域渗透之NTLM Relay
    域渗透之 pre-auth用户枚举
    mysql 必知必会整理—sql 正则表达[五]
    mysql 必知必会整理—sql 简单语句[二]
    redis 简单整理——缓存设计[三十二]
    mysql 必知必会整理——mysql 介绍[一]
    redis 简单整理——哨兵原理[三十一]
    redis 简单整理——客户端哨兵模式[三十]
  • 原文地址:https://www.cnblogs.com/glory-jzx/p/13667296.html
Copyright © 2020-2023  润新知