ADG常用查詢
阿新 • • 發佈:2020-07-28
如果需求是獲得一組資料中的最大值的話,就可以用堆來實現
二叉堆:任意一個節點的值都大於他的子節點,就叫做最大堆,任意一個節點的值都小於它的子節點,就叫做最小堆
二叉堆又叫做完全二叉堆,是一個完全二叉樹,因此,我們可以用陣列來實現.
二叉堆的新增
public void add(E element) { elementNotNullCheck(element); ensureCapacity(size+1); elements[size++] = element; siftUp(size-1); }
publicvoid 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); returnroot; }
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); } }
採用的是自下而上的下濾.