private static <T> void trickleDown( final Object[] deque, final int size, int index, final Comparator<? super T> comparator) { if (Level.MIN.equals(getLevel(size, index))) { if (comparator == null) trickleDownMin(deque, size, index); else trickleDownMinComparator(deque, size, index, comparator); } else { if (comparator == null) trickleDownMax(deque, size, index); else trickleDownMaxComparator(deque, size, index, comparator); } }
@SuppressWarnings("unchecked") private static <T> void bubbleUpComparator( final Object[] deque, final int size, int index, final Comparator<? super T> comparator) { int parentIndex = getParentIndex(index); if (Level.MIN.equals(getLevel(size, index))) { if (index > 0 && comparator.compare((T) deque[index], (T) deque[parentIndex]) > 0) { swap(deque, size, index, parentIndex); bubbleUpMaxComparator(deque, size, parentIndex, comparator); } else { bubbleUpMinComparator(deque, size, index, comparator); } } else { if (index > 0 && comparator.compare((T) deque[index], (T) deque[parentIndex]) < 1) { swap(deque, size, index, parentIndex); bubbleUpMinComparator(deque, size, parentIndex, comparator); } else { bubbleUpMaxComparator(deque, size, index, comparator); } } }
@SuppressWarnings("unchecked") private static <T> void bubbleUp(final Object[] deque, final int size, int index) { int parentIndex = getParentIndex(index); if (Level.MIN.equals(getLevel(size, index))) { if (index > 0 && ((Comparable<? super T>) deque[index]).compareTo((T) deque[parentIndex]) > 0) { swap(deque, size, index, parentIndex); bubbleUpMax(deque, size, parentIndex); } else { bubbleUpMin(deque, size, index); } } else { if (index > 0 && ((Comparable<? super T>) deque[index]).compareTo((T) deque[parentIndex]) < 1) { swap(deque, size, index, parentIndex); bubbleUpMin(deque, size, parentIndex); } else { bubbleUpMax(deque, size, index); } } }