Einzelnen Beitrag anzeigen

Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#34

AW: Sortieren eines Arrays of String

  Alt 23. Jul 2019, 02:56
Ja du kannst natürlich auch CustomSort verwenden. CustomSort ist etwas langsamer* als die Lösung via Sort (bei 5 Mio Elementen ca. 50%), aber dafür sehr übersichtlich.

*langsamer...: Die Vergleichsfunktion v(f(list[index1]), f(list[index2]) ) in CustomCompare wird bei der Ausführung von CustomSort ca. lb(n)*n Mal aufgerufen. => Die Funktion f wird 2*lb(n)*n Mal aufgerufen. => CustomCompare berechnet für jedes der n Listenelemente l[i] den Wert f(l[i]) im Schnitt 2*lb(n) Mal (statt 1 Mal via Sort). Je komplexer die Funktion f ist, desto weniger lohnt sich (punkto Rechenaufwand) der Weg über CusomtSort.


Delphi-Quellcode:
function CustomCompare(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := AnsiCompareText( Copy(List[index1],5,4), Copy(List[index2],5,4) );
end;

procedure TForm115.Button1Click(Sender: TObject);
var arr, hs : TStringList;
    anz, i : integer;

begin
  anz := 5000;

  arr := TStringList.Create;
  for i := 0 to anz do arr.Add(inttohex( random($FFFFFFFF), 8 ) + inttohex( random($FFFFFFFF), 8 ));

  hs := TStringList.Create;

  hs.Text := arr.Text;
  // Mit CustomSort
  hs.CustomSort( CustomCompare );

  hs.Text := arr.Text;
  // Mit Sort
  for i := 0 to anz do
    hs.Strings[i] := Copy(hs.Strings[i],5,4) + hs.Strings[i];
  hs.Sort;
  for i := 0 to anz do
    hs.Strings[i] := Copy( hs.Strings[i],5,maxint );

  hs.Free;
  arr.Free;
end;
Michael Gasser

Geändert von Michael II (23. Jul 2019 um 16:29 Uhr)
  Mit Zitat antworten Zitat