docs: private static <T extends Comparable<? super T>> 
      void mergeSort( T[] arr, T[] tmpArr, int left, int right )
      {
          //recursive way
          if ( left < right ) {
              int center = ( left + right ) / 2;
              mergeSort(arr, tmpArr, left, center);
              mergeSort(arr, tmpArr, center + 1, right);
              merge(arr, tmpArr, left, center + 1, right);
          }
          
          //loop instead
  /*        int len = 2, pos;
          int rpos, offset, cut;
          while ( len <= right ) {
              pos = 0;
              offset = len / 2;
              while ( pos + len <= right  ) {
                  rpos = pos + offset;
                  merge( arr, tmpArr, pos, rpos, rpos + offset - 1 );
                  pos += len;
              }
              
              //merge the rest
              cut = pos + offset;
              if ( cut <= right ) 
                  merge( arr, tmpArr, pos, cut, right );
              
              len *= 2;
          }
          merge( arr, tmpArr, 0, len / 2, right );*/
      }