public void sortBU(T[] a, T[] aux, int left, int right)
	{        
        // Do lg N passes
		for (int n = 1; n < right - left + 1; n = n + n)
		{// n is the subarray size

            // i < N - n. The number of elements from position lo must be
            //  greater than the subarray size so that a split can occur and 
            //  merge can be done across the split.
            // The split always results in a two sorted arrays as the subarray
            //  size is an exponential multiple of the subarray size of the
            // previous iteration
			for (int lo = left; lo < right + 1 - n; lo += n + n)
			{
				int hi = Math.min(lo + (n + n - 1), right);
				merge(a, aux, lo, lo + n - 1, hi);
			}
		}
	}