private void minHeapInsert() {
        int index = elems.size() - 1;
        Node<T> currNode = elems.get(index);

        /* Keep bubbling up until we hit the root or are in the right place. */
        while (index > 1) {
            /* Look up the parent. */
            int parentIndex = index / 2;
            Node<T> parentNode = elems.get(parentIndex);

            /* If we're above the lower bound, we're done. */
            if (comparator.compare(currNode.low, parentNode.low) >= 0) break;

            /* Otherwise, swap with the parent and repeat. */
            T temp = currNode.low;
            currNode.low = parentNode.low;
            parentNode.low = temp;

            /* Update the index and position to reflect the change. */
            index = parentIndex;
            currNode = parentNode;
        }
    }