📄 priorityqueue.java
字号:
if ( size != 0 ) { // percolate top element to it's place in tree if ( ascendingOrder ) { percolateDownMinHeap( 1 ); } else { percolateDownMaxHeap( 1 ); } } return result; } // ----------------------------------------------------------------------- /** * Tests if the buffer is at capacity. * * @return <code>true</code> if buffer is full; <code>false</code> * otherwise. */ protected boolean isAtCapacity() { // +1 as element 0 is noop return elements.length == size + 1; } /** * Percolates element down heap from the position given by the index. <p/> * Assumes it is a minimum heap. * * @param index * the index for the element */ protected void percolateDownMinHeap(final int index) { final Object element = elements[index]; int hole = index; while ( (hole * 2) <= size ) { int child = hole * 2; // if we have a right child and that child can not be percolated // up then move onto other child if ( child != size && compare( elements[child + 1], elements[child] ) < 0 ) { child++; } // if we found resting place of bubble then terminate search if ( compare( elements[child], element ) >= 0 ) { break; } elements[hole] = elements[child]; hole = child; } elements[hole] = element; } /** * Percolates element down heap from the position given by the index. <p/> * Assumes it is a maximum heap. * * @param index * the index of the element */ protected void percolateDownMaxHeap(final int index) { final Object element = elements[index]; int hole = index; while ( (hole * 2) <= size ) { int child = hole * 2; // if we have a right child and that child can not be percolated // up then move onto other child if ( child != size && compare( elements[child + 1], elements[child] ) > 0 ) { child++; } // if we found resting place of bubble then terminate search if ( compare( elements[child], element ) <= 0 ) { break; } elements[hole] = elements[child]; hole = child; } elements[hole] = element; } /** * Percolates element up heap from the position given by the index. <p/> * Assumes it is a minimum heap. * * @param index * the index of the element to be percolated up */ protected void percolateUpMinHeap(final int index) { int hole = index; Object element = elements[hole]; while ( hole > 1 && compare( element, elements[hole / 2] ) < 0 ) { // save element that is being pushed down // as the element "bubble" is percolated up final int next = hole / 2; elements[hole] = elements[next]; hole = next; } elements[hole] = element; } /** * Percolates a new element up heap from the bottom. <p/>Assumes it is a * minimum heap. * * @param element * the element */ protected void percolateUpMinHeap(final Object element) { elements[++size] = element; percolateUpMinHeap( size ); } /** * Percolates element up heap from from the position given by the index. * <p/>Assume it is a maximum heap. * * @param index * the index of the element to be percolated up */ protected void percolateUpMaxHeap(final int index) { int hole = index; Object element = elements[hole]; while ( hole > 1 && compare( element, elements[hole / 2] ) > 0 ) { // save element that is being pushed down // as the element "bubble" is percolated up final int next = hole / 2; elements[hole] = elements[next]; hole = next; } elements[hole] = element; } /** * Percolates a new element up heap from the bottom. <p/>Assume it is a * maximum heap. * * @param element * the element */ protected void percolateUpMaxHeap(final Object element) { elements[++size] = element; percolateUpMaxHeap( size ); } /** * Compares two objects using the comparator if specified, or the natural * order otherwise. * * @param a * the first object * @param b * the second object * @return -ve if a less than b, 0 if they are equal, +ve if a greater than * b */ protected int compare(Object a, Object b) { if ( comparator != null ) { return comparator.compare( a, b ); } else { return ((Comparable) a).compareTo( b ); } } /** * Increases the size of the heap to support additional elements */ protected void grow() { final Object[] array = new Object[elements.length * 2]; System.arraycopy( elements, 0, array, 0, elements.length ); elements = array; } // ----------------------------------------------------------------------- /** * Returns an iterator over this heap's elements. * * @return an iterator over this heap's elements */ public Iterator iterator() { return new Iterator( ) { private int index = 1; private int lastReturnedIndex = -1; public boolean hasNext() { return index <= size; } public Object next() { if ( !hasNext( ) ) { throw new NoSuchElementException( ); } lastReturnedIndex = index; index++; return elements[lastReturnedIndex]; } public void remove() { if ( lastReturnedIndex == -1 ) { throw new IllegalStateException( ); } elements[lastReturnedIndex] = elements[size]; elements[size] = null; size--; if ( size != 0 && lastReturnedIndex <= size ) { int compareToParent = 0; if ( lastReturnedIndex > 1 ) { compareToParent = compare( elements[lastReturnedIndex], elements[lastReturnedIndex / 2] ); } if ( ascendingOrder ) { if ( lastReturnedIndex > 1 && compareToParent < 0 ) { percolateUpMinHeap( lastReturnedIndex ); } else { percolateDownMinHeap( lastReturnedIndex ); } } else { // max heap if ( lastReturnedIndex > 1 && compareToParent > 0 ) { percolateUpMaxHeap( lastReturnedIndex ); } else { percolateDownMaxHeap( lastReturnedIndex ); } } } index--; lastReturnedIndex = -1; } }; } /** * Returns a string representation of this heap. The returned string is * similar to those produced by standard JDK collections. * * @return a string representation of this heap */ public String toString() { final StringBuffer sb = new StringBuffer( ); sb.append( "[ " ); for ( int i = 1; i < size + 1; i++ ) { if ( i != 1 ) { sb.append( ", " ); } sb.append( elements[i] ); } sb.append( " ]" ); return sb.toString( ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -