public override void Sort<T>(T[] a)
{
var n = a.Length;
var h = 1;
while (h < n / 3)
{
h = 3 * h + 1;
}
while (h >= 1)
{
var compareTime = 0;
for (var i = h; i < n; i++)
{
for (var j = i; j >= h && Less(a[j], a[j - h]); j -= h)
{
compareTime++;
Exch(a, j, j - h);
}
}
Debug.Assert(IsHSorted(a, h));
Console.Write("h:" + h + "\t");
Console.WriteLine("CompareTime/ArraySize = " + (double)compareTime / a.Length);
h /= 3;
}
Debug.Assert(IsSorted(a));
}