const IntrosortSizeThreshold = 16;
class function GetDepthLimit(count: Integer): Integer; static;
- class procedure SortTwoItems<T>(const comparer: IComparer<T>; left, right: Pointer); static; inline;
- class procedure SortThreeItems<T>(const comparer: IComparer<T>; left, mid, right: Pointer); static; inline;
+ class procedure Swap<T>(var left, right: T); static; inline;
+ class procedure SortTwoItems<T>(const comparer: IComparer<T>; var left, right: T); static;
+ class procedure SortThreeItems<T>(const comparer: IComparer<T>; var left, mid, right: T); static;
class procedure InsertionSort<T>(var values: array of T; const comparer: IComparer<T>; left, right: Integer); static;
class function QuickSortPartition<T>(var values: array of T; const comparer: IComparer<T>; left, right: Integer): Integer; static;
- class procedure IntroSort<T>(var values: array of T; const comparer: IComparer<T>; left, right, depthLimit: Integer); overload; static;
+ class procedure IntroSort<T>(var values: array of T; const comparer: IComparer<T>; left, right, depthLimit: Integer); static;
class procedure Sort<T>(var values: array of T); overload; static;
class procedure Sort<T>(var values: array of T; const comparer: IComparer<T>); overload; static;
class procedure Sort<T>(var values: array of T; const comparer: IComparer<T>; index, count: Integer); overload; static;
+procedure SwapPtr(var left, right); inline;
+procedure SwapPtr(var left, right);
+ Pointer(left) := Pointer(right);
+ Pointer(right) := temp;
class function TArray.GetDepthLimit(count: Integer): Integer;
-class procedure TArray.SortTwoItems<T>(const comparer: IComparer<T>; left,
+class procedure TArray.Swap<T>(var left, right: T);
- if comparer.Compare(PT(left)^, PT(right)^) > 0 then
- PT(left)^ := PT(right)^;
-class procedure TArray.SortThreeItems<T>(const comparer: IComparer<T>; left,
+class procedure TArray.SortTwoItems<T>(const comparer: IComparer<T>;
- if comparer.Compare(PT(left)^, PT(mid)^) > 0 then
- if comparer.Compare(PT(left)^, PT(right)^) > 0 then
- PT(left)^ := PT(right)^;
- if comparer.Compare(PT(mid)^, PT(right)^) > 0 then
- PT(mid)^ := PT(right)^;
+ if comparer.Compare(left, right) > 0 then
+class procedure TArray.SortThreeItems<T>(const comparer: IComparer<T>;
+ var left, mid, right: T);
+ if comparer.Compare(left, mid) > 0 then
+ if comparer.Compare(left, right) > 0 then
+ if comparer.Compare(mid, right) > 0 then
class procedure TArray.DownHeap<T>(var values: array of T;
const comparer: IComparer<T>; left, right: Integer);
count := right - left + 1;
for i := count div 2 downto 1 do
DownHeap<T>(values, comparer, left, count, i);
for i := count downto 2 do
- values[left] := values[left + i - 1];
- values[left + i - 1] := temp;
+ Swap(values[left], values[left + i - 1]);
DownHeap<T>(values, comparer, left, i - 1, 1);
const comparer: IComparer<T>; left, right: Integer): Integer;
mid, pivotIndex: Integer;
mid := left + (right - left) div 2;
- SortThreeItems<T>(comparer, @values[left], @values[mid], @values[right]);
+ SortThreeItems<T>(comparer, values[left], values[mid], values[right]);
- values[mid] := values[right];
- values[right] := pivot;
+ Swap(values[mid], values[right]);
- values[left] := values[right];
+ Swap(values[left], values[right]);
- values[left] := values[pivotIndex];
- values[pivotIndex] := pivot;
+ Swap(values[left], values[pivotIndex]);
- SortTwoItems<T>(comparer, @values[left], @values[right]);
+ SortTwoItems<T>(comparer, values[left], values[right]);
- SortThreeItems<T>(comparer, @values[left], @values[right - 1], @values[right]);
+ SortThreeItems<T>(comparer, values[left], values[right - 1], values[right]);
if count <= IntrosortSizeThreshold then