code: @Override
      @LogarithmicTime
      public Integer deleteMin() {
          if (Constants.NOT_BENCHMARK && size == 0) {
              throw new NoSuchElementException();
          }
  
          Integer result = array[1].key;
  
          // first move up elements on a min-path
          int hole = 1;
          int succ = 2;
          int sz = size;
          while (succ < sz) {
              int key1 = array[succ].key;
              int key2 = array[succ + 1].key;
              if (key1 > key2) {
                  succ++;
                  array[hole].key = key2;
                  array[hole].value = array[succ].value;
              } else {
                  array[hole].key = key1;
                  array[hole].value = array[succ].value;
              }
              hole = succ;
              succ <<= 1;
          }
  
          // bubble up rightmost element
          int bubble = array[sz].key;
          int pred = hole >> 1;
          while (array[pred].key > bubble) {
              array[hole].key = array[pred].key;
              array[hole].value = array[pred].value;
              hole = pred;
              pred >>= 1;
          }
  
          // finally move data to hole
          array[hole].key = bubble;
          array[hole].value = array[sz].value;
  
          array[size].key = SUP_KEY;
          array[size].value = null;
          size = sz - 1;
  
          if (Constants.NOT_BENCHMARK) {
              // free unused space
              int currentCapacity = array.length - 2;
              if (2 * minCapacity <= currentCapacity && 4 * size < currentCapacity) {
                  ensureCapacity(currentCapacity / 2);
              }
          }
  
          return result;
      }
docs: {@inheritDoc}