internal void SortObject(long left, long right){ //left and right are longs to allow for values < 0. Their positives values are always < UInt32.MaxValue.
Object x, y;
if (right > left){
long piv = left + (long)((right - left)*MathObject.random());
LateBinding.SwapValues(this.obj, (uint)piv, (uint)right);
x = LateBinding.GetValueAtIndex(this.obj, (ulong)right);
long i = left - 1, j = right;
while(true){
do{
y = LateBinding.GetValueAtIndex(this.obj, (ulong)++i);
}while(i < j && this.Compare(x, y) >= 0);
do{
y = LateBinding.GetValueAtIndex(this.obj, (ulong)--j);
}while(j > i && this.Compare(x, y) <= 0);
if (i >= j)
break;
LateBinding.SwapValues(this.obj, (uint)i, (uint)j);
}
LateBinding.SwapValues(this.obj, (uint)i, (uint)right);
this.SortObject(left, i-1);
this.SortObject(i+1, right);
}
}