Ik vond de volgende mooie code voor een QuickSort routine voor een TStringList in Lazarus Pascal:
procedure QuickSort(var A: TStringList);
procedure Sort(L, R: Integer);
var
I, J: Integer;
Y, X:string;
begin
I:= L; J:= R; X:= A[(L+R) DIV 2];
repeat
while strIcomp(pchar(A),pchar(X))<0 do inc(I);
while StrIComp(pchar(X),pchar(A[J]))<0 do dec(J);
if I <= J then
begin
Y:= A; A:= A[J]; A[J]:= Y;
inc(I); dec(J);
end;
until I > J;
if L < J then Sort(L,J);
if I < R then Sort(I,R);
end;
begin
Sort(0,A.Count-1);
end;
Het is bedoelt voor gebruik met een TStringList en wordt als volgt aangeroepen:
QuickSort(MyStringList);
Dat is helaas niet wat ik nodig had - ik wilde namelijk een array of records sorteren.
Hieronder de aangepaste versie voor hets sorteren van mijn array of records:
TSomeLanguage = record
abbreviation: string;
name: string;
englishName: string;
end;
...
SomeLanguages : array of TSomeLanguage;
...
procedure TNMTVForm.QuickSortLanguages(var A: array of TSomeLanguage);
procedure Sort(L, R: Integer);
var
I, J: Integer;
Y, X: TTVDBSeries;
begin
I:= L; J:= R; X:= A[(L+R) DIV 2];
repeat
while strIcomp(pchar(A.englishName),pchar(X.englishName))<0 do inc(I); // <-- adapt to your array
while StrIComp(pchar(X.englishName),pchar(A[J].englishName))<0 do dec(J); // <-- adapt to your array
if I <= J then
begin
Y:= A; A:= A[J]; A[J]:= Y;
inc(I); dec(J);
end;
until I > J;
if L < J then Sort(L,J);
if I < R then Sort(I,R);
end;
begin
Sort(0,length(A)-1);
end;
...
QuickSortLanguages(SomeLanguages);
...
Dit sorteert de array "SomeLanguages" op basis van het veld "englishName".
Je ziet ook aangegeven welke 2 regels je moet aanpassen voor jouw eigen array of records.
Hopelijk heeft iemand hier iets aan ...