java——大根堆

大根堆

大根堆与小根堆类似,只是它的堆顶元素值是最大的,子节点的值小于父节点的值,一般用来在n个数中找出最小的m个数

/**
 * @author lzq
 *
 */
public class DaGenDui {
	private static final  int  LENGTH = 10;
    private int size;
    private int maxsize;
    private int[] array;

    public DaGenDui() {
        initHeap(LENGTH);
    }
    public DaGenDui(int capacity) {
        if(capacity<1) {
        	System.out.println("非法长度");
        }
        initHeap(capacity);
    }


    private void initHeap(int initCapacity) {
        this.maxsize = initCapacity;
        array = new int[initCapacity];
        size = 0;
    }


    public void add(int x) {
        if(size==0) {
            array[size++] = x;
        }else if(!isFull()) {
            adjust1(size++,x);
        }else {
            if(x < getTop()) {
                remove();
                add(x);
            }
        }
    }

    public boolean isFull() {
        return size>=maxsize;
    }

    public int getTop() {
        return array[0];
    }
    
    public int remove() {
        int cur = getTop();
        int temp = array[--size];
        array[0] = temp;
        adjust2(0,temp);
        return cur;
    }
    
    private void adjust1(int k,int value) {
        while(k>0) {
            int root = (k-1)>>>1;
            if(array[root]>=value) {
                break;
            }
            array[k] = array[root];
            k = root;
        }
        array[k] = value;
    }

    private void adjust2(int k,int vale) {
        int half = size>>>1;
        while (k<half) {
            int child = (k<<1)+1;
            int childVal = array[child];
            int RightChild = child+1;
            //此处要找最大的孩子
            if(RightChild<size && childVal<array[RightChild]) {
                childVal = array[child = RightChild];
            }
            if(childVal<vale) {
                break;
            }
            array[k] = array[child];
            k = child;
        }
        array[k] = vale;
    }

    public void show() {
        for (int i = 0; i < size; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }

    public void put(int[] a) {
        for (int i = 0; i < a.length; i++) {
            add(a[i]);
        }
    }
}

运行结果:

25 12 16 5 4 

猜你喜欢

转载自blog.csdn.net/QQ2899349953/article/details/83417630