## 2005. július 21., csütörtök

### How to sort a TList

Problem/Question/Abstract:

How to sort a TList

procedure BubbleSort(const List: TList; const Compare: TListSortCompare);
var
Limit: Integer;
I: Integer;
Temp: Pointer;
Swapped: Boolean;
begin
for Limit := (List.Count - 1) downto 1 do
begin
Swapped := False;
for I := 0 to (Limit - 1) do
if (Compare(List[I], List[I + 1]) > 0) then
begin
Temp := List[I];
List[I] := List[I + 1];
List[I + 1] := Temp;
Swapped := True;
end;
if (not Swapped) then
Break;
end;
end;

procedure InsertionSort(const List: TList; const Compare: TListSortCompare);
var
Step: Integer;
Temp: Pointer;
I: Integer;
begin
for Step := 1 to (List.Count - 1) do
begin
Temp := List[Step];
for I := (Step - 1) downto 0 do
if (Compare(List[I], Temp) > 0) then
List[I + 1] := List[I]
else
Break;
List[I + 1] := Temp;
end;
end;

procedure ShellSort(const List: TList; const Compare: TListSortCompare);
var
Step: Integer;
H: Integer;
I: Integer;
Temp: Pointer;
begin
H := 1;
while (H <= (List.Count div 9)) do
H := 3 * H + 1;
while (H > 0) do
begin
for Step := H to (List.Count - 1) do
begin
Temp := List[Step];
I := Step - H;
while (I >= 0) do

begin
if (Compare(Temp, List[I]) < 0) then
List[I + H] := List[I]
else
Break;
Dec(I, H);
end;
List[I + H] := Temp;
end;
H := H div 3;
end;
end;

procedure QuickSort1(const List: TList; const Compare: TListSortCompare;
const L: Integer; const R: Integer);
var
I: Integer;
J: Integer;
Temp: Pointer;
begin
I := L - 1;
J := R;
repeat
Inc(I);
while (Compare(List[I], List[R]) < 0) do
Inc(I);
Dec(J);
while (J > 0) do
begin
Dec(J);
if (Compare(List[J], List[R]) <= 0) then
Break;
end;
if (I >= J) then
Break;
Temp := List[I];
List[I] := List[J];
List[J] := Temp;
until
(False);
Temp := List[I];
List[I] := List[R];
List[R] := Temp;
end;

procedure QuickSort(const List: TList; const Compare: TListSortCompare);
begin
QuickSort1(List, Compare, 0, List.Count - 1);
end;