code: @Override
      public final int[] buildSuffixArray(int[] input, int start, int length) {
          Tools.assertAlways(input.length >= start + length + 1, "no extra space after input end");
          MinMax minmax = Tools.minmax(input, start, length);
          Tools.assertAlways(minmax.min >= 0, "input must not be negative");
          I = new int[length + 1];
          this.start = start;
          if (preserveInput) {
              V = new int[length + 1];
              this.start = 0;
              System.arraycopy(input, start, V, 0, length);
          } else {
              V = input;
          }
          suffixsort(length, minmax.max + 1, minmax.min);
  
          final int[] tmp = I;
          V = I = null;
          return tmp;
      }
docs: {@inheritDoc}
  <p>
  Additional constraints enforced by qsufsort algorithm:
  <ul>
  <li>non-negative (&ge;0) symbols in the input</li>
  <li>length &gt;= 2</li>
  </ul>
  <p>