type TCustomRecord = record Key: WideString; foo1:Int64; foo2:TDatetime; foo3:Extended; end; TCustomArray = array of TCustomRecord; procedure QuickSort(var A: TCustomArray; L, R: Integer; var tmp: TCustomRecord); var OrigL, OrigR: Integer; Pivot: WideString; GoodPivot, SortPartitions: Boolean; begin if L=Pivot) do Dec(R); if (L=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 A[R].Key<>Pivot then begin //we have at least one different value than our pivot Pivot:=A[R].Key; //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 QuickSort(A, OrigL, L, tmp); QuickSort(A, L+1, OrigR, tmp); end; end; end; //delphi/4528