如果需求是获得一组数据中的最大值的话,就可以用堆来实现

二叉堆:任意一个节点的值都大于他的子节点,就叫做最大堆,任意一个节点的值都小于它的子节点,就叫做最小堆

二叉堆又叫做完全二叉堆,是一个完全二叉树,因此,我们可以用数组来实现.

二叉堆的添加

public void add(E element) {
        elementNotNullCheck(element);
        ensureCapacity(size+1);
        elements[size++] = element;
        siftUp(size-1);
        
    }

 

public void siftUp(int index){
        E element = elements[index];
        while(index > 0){
            int parentIndex = (index - 1) >> 1; 
            E parent = elements[parentIndex];
        
            if(compare(parent , element) > 0) break;
            elements[index] = parent;
            index = parentIndex;
        }
        elements[index] = element;
        
    }

上滤操作。

二叉堆的删除

public E remove() {
        emptyCheck();
        int lastIndex = --size;
        E root = elements[0];
        elements[0] = elements[lastIndex];
        elements[lastIndex] = null;
        siftDown(0);
        return root;
    }

 

public void siftDown(int index){
        E element = elements[index];
        int half = size >> 1;
        while(index < half){
            int childIndex = (index << 1) + 1;
            E child = elements[childIndex];
            int rightChild = childIndex +1;
            if(rightChild < size  && compare(child,elements[rightChild]) < 0){
                child = elements[childIndex = rightChild];
            }
            
            if(compare(element,child) > 0) break;
            elements[index] = child;
            index = childIndex;
        }
        elements[index] = element;
    }

下滤操作

批量建堆

    public void heapify(){
        for(int i = (size >> 1) - 1 ; i >= 0 ; i--){
            siftDown(i);
        }
    }

采用的是自下而上的下滤.

 

你可能感兴趣的:(堆)