@SuppressWarnings({"rawtypes","unchecked"}) private static void mergeSort(Object[] src,Object[] dest,int low,int high,int off,Comparator c){
  int length=high - low;
  if (length < INSERTIONSORT_THRESHOLD) {
    for (int i=low; i < high; i++)     for (int j=i; j > low && c.compare(dest[j - 1],dest[j]) > 0; j--)     swap(dest,j,j - 1);
    return;
  }
  int destLow=low;
  int destHigh=high;
  low+=off;
  high+=off;
  int mid=(low + high) >>> 1;
  mergeSort(dest,src,low,mid,-off,c);
  mergeSort(dest,src,mid,high,-off,c);
  if (c.compare(src[mid - 1],src[mid]) <= 0) {
    System.arraycopy(src,low,dest,destLow,length);
    return;
  }
  for (int i=destLow, p=low, q=mid; i < destHigh; i++) {
    if (q >= high || p < mid && c.compare(src[p],src[q]) <= 0)     dest[i]=src[p++];
 else     dest[i]=src[q++];
  }
}

@ SuppressWarnings ( { "rawtypes" , "unchecked" } ) private static void mergeSort ( Object [ ] src , Object [ ] dest , int low , int high , int off , Comparator c ) { int length = high - low ; if ( length < INSERTIONSORT_THRESHOLD ) { for ( int i = low ; i < high ; i ++ ) for ( int j = i ; j > low && c . compare ( dest [ j - 1 ] , dest [ j ] ) > 0 ; j -- ) swap ( dest , j , j - 1 ) ; return ; } int destLow = low ; int destHigh = high ; low += off ; high += off ; int mid = ( low + high ) > > > 1 ; mergeSort ( dest , src , low , mid , - off , c ) ; mergeSort ( dest , src , mid , high , - off , c ) ; if ( c . compare ( src [ mid - 1 ] , src [ mid ] ) <= 0 ) { System . arraycopy ( src , low , dest , destLow , length ) ; return ; } for ( int i = destLow , p = low , q = mid ; i < destHigh ; i ++ ) { if ( q >= high || p < mid && c . compare ( src [ p ] , src [ q ] ) <= 0 ) dest [ i ] = src [ p ++ ] ; else dest [ i ] = src [ q ++ ] ; } }
src is the source array that starts at index 0 dest is the ( possibly larger ) array destination with a possible offset low is the index in dest to start sorting high is the end index in dest to end sorting off is the offset into src corresponding to low in dest to be removed in a future release .
