{******************************************************************************}
// QUICK SORT STRING ARRAY 2 EXTENDED (multidimensional)
// Extended in this case: The values will be compared UPPERCASE, a < B
// http://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Quicksort#Delphi
{******************************************************************************}
procedure QuickSortStringArray2Ex(
var A: TStringArray2; L, R: Integer; SortCol: Integer);
var
OrigL,
OrigR: Integer;
Pivot:
string;
GoodPivot,
SortPartitions: Boolean;
tmp: TStringArray;
begin
if L<R
then begin
Pivot:=UPPERCASE(A[L+Random(R-L),SortCol]);
OrigL:=L;
//saving original bounds
OrigR:=R;
repeat
L:=OrigL;
//restoring original bounds if we
R:=OrigR;
//have chosen a bad pivot value
while L<R
do begin
while (L<R)
and (UPPERCASE(A[L,SortCol])<Pivot)
do Inc(L);
while (L<R)
and (UPPERCASE(A[R,SortCol])>=Pivot)
do Dec(R);
if (L<R)
then begin
tmp:=A[L];
A[L]:=A[R];
A[R]:=tmp;
Dec(R);
Inc(L);
end;
end;
if UPPERCASE(A[L,SortCol])>=Pivot
then Dec(L);
//has we managed to choose
GoodPivot:=L>=OrigL;
//a good pivot value?
SortPartitions:=True;
//if so, then sort on
if not GoodPivot
then begin //bad luck, the pivot is the smallest one in our range
GoodPivot:=True;
//let's presume that all the values are equal to pivot
SortPartitions:=False;
//then no need to sort it
for R := OrigL
to OrigR
do if UPPERCASE(A[R,SortCol])<>Pivot
then begin //we have at least one different value than our pivot
Pivot:=UPPERCASE(A[R,SortCol]);
//so this will be our new pivot
GoodPivot:=False;
//we have to start again sorting this range
Break;
end;
end;
until GoodPivot;
if SortPartitions
then begin
QuickSortStringArray2Ex(A, OrigL, L, SortCol);
QuickSortStringArray2Ex(A, L+1, OrigR, SortCol);
end;
end;
end;