protected void InternalSort(
ref Array primary,
int left,
int right,
System.Collections.IComparer compare)
{
if (secondary == null || secondary.Length != primary.Length)
secondary = (Array)primary.Clone();
if (right > left)
{
int middle = (left + right) / 2;
InternalSort(ref primary, left, middle, compare);
InternalSort(ref primary, middle + 1, right, compare);
int i, j, k;
for (i = middle + 1; i > left; i--)
secondary.SetValue(primary.GetValue(i - 1), i - 1);
for (j = middle; j < right; j++)
secondary.SetValue(primary.GetValue(j + 1), right + middle - j);
for (k = left; k <= right; k++)
primary.SetValue(
(compare.Compare(secondary.GetValue(i), secondary.GetValue(j)) < 0) ?
secondary.GetValue(i++) :
secondary.GetValue(j--), k);
}
}