@Override public <T extends Comparable<? super T>> void merge(final T[] a,
		final int start, final int middle, final int end)
	{
		assert start >= 0;
		assert start < middle;
		assert middle < end;
		assert end <= a.length;

		/** I don't know a better way to create a generic array. */
		final T[] b = (T[])new Comparable [a.length];

		int i, k, j;

		i = k = start;
		j = middle;

		while(i != middle && j != end)
		{
			b[k++] = a[(a[i].compareTo(a[j]) <= 0) ? (i++) : (j++)];
		}

		while(i != middle)
		{
			b[k++] = a[i++];
		}

		while(j != end)
		{
			b[k++] = a[j++];
		}

		for(i = start; i != end; i++)
		{
			a[i] = b[i];
		}
	}