private static int Partition(IComparable[] a, int lo, int hi)
        {
            int         i = lo, j = hi + 1;
            IComparable v = a[lo];

            while (true)
            {
                while (SortHelper.Less(a[++i], v))
                {
                    if (i == hi)
                    {
                        break;
                    }
                }
                while (SortHelper.Less(v, a[--j]))
                {
                    if (j == lo)
                    {
                        break;
                    }
                }
                if (i >= j)
                {
                    break;
                }
                SortHelper.Exchange(a, i, j);
            }
            SortHelper.Exchange(a, lo, j);
            return(j);
        }
        private static int Partition <Key>(Key[] a, IComparer <Key> c, int lo, int hi) where Key : class
        {
            int i = lo, j = hi + 1;
            Key v = a[lo];

            while (true)
            {
                while (SortHelper.Less(c, a[++i], v))
                {
                    if (i == hi)
                    {
                        break;
                    }
                }
                while (SortHelper.Less(c, v, a[--j]))
                {
                    if (j == lo)
                    {
                        break;
                    }
                }
                if (i >= j)
                {
                    break;
                }
                SortHelper.Exchange(a, i, j);
            }
            SortHelper.Exchange(a, lo, j);
            return(j);
        }