docs: public void splitupNoSort(ArrayModifiableDBIDs ind, int begin, int end, int dim, Random rand) {
      final int nele = end - begin;
      dim = dim % projectedPoints.length;// choose a projection of points
      DoubleDataStore tpro = projectedPoints[dim];
  
      // save set such that used for density or neighborhood computation
      // sets should be roughly minSplitSize
      if(nele > minSplitSize * (1 - sizeTolerance) && nele < minSplitSize * (1 + sizeTolerance)) {
        // sort set, since need median element later
        ind.sort(begin, end, new DataStoreUtil.AscendingByDoubleDataStore(tpro));
        splitsets.add(DBIDUtil.newArray(ind.slice(begin, end)));
      }
  
      // compute splitting element
      // do not store set or even sort set, since it is too large
      if(nele > minSplitSize) {
        // splits can be performed either by distance (between min,maxCoord) or by
        // picking a point randomly(picking index of point)
        // outcome is similar
  
        // int minInd splitByDistance(ind, nele, tpro);
        int minInd = splitRandomly(ind, begin, end, tpro, rand);
  
        // split set recursively
        // position used for splitting the projected points into two
        // sets used for recursive splitting
        int splitpos = minInd + 1;
        splitupNoSort(ind, begin, splitpos, dim + 1, rand);
        splitupNoSort(ind, splitpos, end, dim + 1, rand);
      }
    }