堆
如果需求是获得一组数据中的最大值的话,就可以用堆来实现
二叉堆:任意一个节点的值都大于他的子节点,就叫做最大堆,任意一个节点的值都小于它的子节点,就叫做最小堆
二叉堆又叫做完全二叉堆,是一个完全二叉树,因此,我们可以用数组来实现.
二叉堆的添加
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); } }
采用的是自下而上的下滤.