[TP] Procedure "Sortieren" - Wie?

deadzoneman

Lt. Junior Grade
Registriert
Jan. 2003
Beiträge
347
hi,
manch einer hat ja vielleicht mitgekriegt, wie ich in nem thraet was fürn nen Buchverwaltungsprogramm gefragt hab (lösungsvorschlag hatte geklappt, gab aber noch nen anderen im fehler menü). nun hab ich doch nen eigenes geschrieben, bzw. bin noch dabei. Ich habe das nun so gemacht, dass, wenn der benutzer ein neues buch in die liste aufgenommen hat, dieses buch mit titel in einer textdatei, namens "buecher.txt" abgespeichert wird, sodass der benutzer diese liste später wieder abfragen kann. nun ist die liste so geordnet, wie sie eingegeben wurde. ich würde jetzt aber gerne die bucher nach dem autor sortieren. ich hab mir gedacht, das er den ersten char des ators einliest und den dann mit dem darauffolgenden autor vergleicht, und wenn nötig die beiden austauscht, sodass er sich am ende die ganze liste runtergearbeitet hat (oder so was ähnliches).
im anhang liegt der code, aber wer den code compilen will, muss noch den pfad der 'buecher.txt' ändern.
 

Anhänge

Ich will ja nicht fies sein... aber der Quellcode ist wirklich eine Zumutung. Durch die Unmenge an globalen Variablen mit so schönen Namen wie a,b,c... ist selbst bei diesem Miniprogramm schwer durchzusteigen. Sei mir bitte nicht böse, wenn ich Dir jetzt keinen perfekt in dein Programm passenden Algorithmus präsentiere.

Ein ganz einfacher Sortieralgorithmus funktioniert aber so: (das sollte übrigens ein Bubble-Sort sein)
1. Am Anfang der Liste Anfangen.
2. Die ersten beiden Elemente der Liste vergleichen.
3. Ist das erste Element größer als das Zweite, dann vertausche sie.
4. Weitermachen beim 2. + 3. Element etc. bis das Ende der Liste erreicht ist.
5. Jetzt machst Du solange wieder bei Punkt 1 weiter, bis es keine Vertauschungen gab.
6. Fertig, die Liste ist sortiert

Strings solltest Du auch schon in TP einfach mit <, > und = vergleichen können.
 
Zum sortieren gibt es mehrere Möglichkeiten. Die 3 bekanntesten findest du bei Delphi in der Threads-Demo. Der schnellste Sortieralgorithmus, von dem ich weiss, ist der Quicksort.

Deshalb gibts jezz hier die QSort-Prozedur aus der Delphi-Demo.

Wenn du sie von Integers auf Strings änderst, sollte sie dem entsprechen, was du haben wolltest. Anmerkung: QSort benutzt rekursive aufrufe. Du solltest ihn also nicht unbedingt an Endloslisten ausprobieren ;)



Code:
procedure TQuickSort.Sort(var A: array of Integer);

  procedure QuickSort(var A: array of Integer; iLo, iHi: Integer);
  var
    Lo, Hi, Mid, T: Integer;
  begin
    Lo := iLo;
    Hi := iHi;
    Mid := A[(Lo + Hi) div 2];
    repeat
      while A[Lo] < Mid do Inc(Lo);
      while A[Hi] > Mid do Dec(Hi);
      if Lo <= Hi then
      begin
        T := A[Lo];
        A[Lo] := A[Hi];
        A[Hi] := T;
        Inc(Lo);
        Dec(Hi);
      end;
    until Lo > Hi;
    if Hi > iLo then QuickSort(A, iLo, Hi);
    if Lo < iHi then QuickSort(A, Lo, iHi);
  end;

begin
  QuickSort(A, Low(A), High(A));
end;
 
Zurück
Oben