public void sort(T[] a, int lo, int hi)
	{
		if (hi <= lo)
			return;
	// Optimisation 1 : Sentinel to prevent array out of bounds checking
		exch(a, min(a, lo, hi), lo);
		
		// Sort a[] into increasing order.
		for (int i = lo + 2; i <= hi; i++)
		{ // Insert a[i] among a[i-1], a[i-2], a[i-3]... ..
			int j = i;
			T t = a[i];
			while (less(t, a[j - 1]))
			{// Optimisation 2: Half exchanges result in half the number of memory accesses
				a[j] = a[j - 1];
				j--;
			}
			a[j] = t;
		}

	}