private void mergeFasterNonStable(T[] a, T[] aux,
			int lo, int mid, int hi)
	{

		// Copy a[lo..mid] to aux[lo..mid].
		for (int k = lo; k <= mid; k++)
			aux[k] = a[k];

		// Copy a[mid+1..hi] to aux[hi..mid+1].
		// i.e. copy the 2nd half in decreasing order
		for (int k = hi, m = mid + 1; k > mid; k--, m++)
			aux[k] = a[m];

		// i and j is used to point to the currently processing element in the
		// first and 2nd half respectively
		int i = lo, j = hi;

		// Merge back to a[lo..hi].
		// No need to check if either halves have been exhausted. If they get
		// exhausted, their respective pointers fall into the other half and all
		// is equally well
		for (int k = lo; k <= hi; k++)
			if (less(aux[j], aux[i]))
				a[k] = aux[j--];
			else
				a[k] = aux[i++];
	}