private void mergeWithoutCopy(T[] src, T[] dst,
			int lo, int mid, int hi)
	{// Though 'mid' can be calculated in the body, it is sent as a parameter as
     //  one may always not want to merge 2 equal subarrays. Look at bottem up
     //  merge sort

		// i and j is used to point to the currently processing element in
		// the 1st and 2nd half respectively
		int i = lo, j = mid + 1;
			// Merge back to a[lo..hi]
			for (int k = lo; k <= hi; k++)
				if (i > mid) // 1st half exhausted
					dst[k] = src[j++];
				else if (j > hi) // 2nd half exhausted
					dst[k] = src[i++];
				else if (less(src[j], src[i])) // Only this instruction counts 
                                               //  for the comparisons accounted
                                               //   in the analysis
					dst[k] = src[j++];
				else
					dst[k] = src[i++];
	}