internal static void QuickSort(IList list, int left, int right, IComparer comparer)
{
int i, j, middle;
object pivot;
if (left >= right)
{
return;
}
// Pick the pivot using the median-of-three strategy.
// Be careful with overflows
middle = left + ((right - left) / 2);
if (comparer.Compare(list[middle], list[left]) < 0)
{
Swap(list, middle, left);
}
if (comparer.Compare(list[right], list[left]) < 0)
{
Swap(list, right, left);
}
if (comparer.Compare(list[right], list[middle]) < 0)
{
Swap(list, right, middle);
}
if (right - left + 1 <= 3)
{
return;
}
// Put the pivot in right - 1.
Swap(list, right - 1, middle);
// List should look like:
//
// [Small] ..Numbers.. [Middle] ..Numbers.. [Pivot][Large]
pivot = list[right - 1];
// Sort from (left + 1) to (right - 2).
i = left;
j = right - 1;
for (;;)
{
while (comparer.Compare(list[++i], pivot) < 0);
while (comparer.Compare(list[--j], pivot) > 0);
if (i < j)
{
Swap(list, i, j);
}
else
{
break;
}
}
// Put pivot into the right position (real middle).
Swap(list, right - 1, i);
// Recursively sort the left and right sub lists.
QuickSort(list, left, i - 1, comparer);
QuickSort(list, i + 1, right, comparer);
}