Einzelnen Beitrag anzeigen

taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#11

Re: Quicksort eines Datensatzes nach alphabet

  Alt 25. Jan 2008, 19:26
Hallo Sai!
Nun habe ich mal das alte Tp7 'rausgesucht. Beim Ausflug in die Vergangenheit habe ich mich dann ein wenig in alten Erinnerungen "festgelesen" - also hat es etwas länger gedauert. Dynamische Arrays hat es unter TP7 ja noch nicht gegeben, für die Speicherung der Datensätze hätte man damals also den Heap verwendet und eine verkettete Liste oder einen Baum angelegt. Das würde an dieser Stelle aber wohl zu weit gehen.

Wenn ich mich richtig erinnere, hast du unter TP7 nur 64 KBytes für alle Variablen zur Verfügung wenn du den Heap nicht benutzt. In Anbetracht der von dir genannten maximalen 100 Datensätze machen wir es am einfachsten so, wie man es eigentlich nicht machen sollte:

In der Unit deklarieren wir den DatenRecord, ein statisches Array um die Daten im RAM zu halten und einen Datensatz-Zähler...

Delphi-Quellcode:
type tDataRec = record of
                 Name : String[aa]; // Länge eintragen!!
                 Rasse : String[bb]; // Länge eintragen!!
                 end;

var DataArray : Array[0..99] of tDataRec;
     AnzData : Integer;
Dann brauchen wir eine Procedur, um die Daten in das Array einzulesen...

Delphi-Quellcode:
procedure ReadData;
var f : file of tDataRec;
    Idx : Integer;
begin
  Idx :=0;
  AnzData:=0;
  assign(f,FileName);
  {$I-} reset(f); {$I+}
  if IOresult=0 then begin
    while not(eof(f)) do begin
      read(f,DataArray[Idx]);
      inc(Idx);
      end;
    close(f);
    AnzData:=Idx;
    end;
end;
Anschließend wird das Array sortiert. Habe dafür einen uralten, nicht rekursiven Quicksort gefunden und an unsere Aufgabenstellung angepasst, der unter TP7 funktionieren müsste...

Delphi-Quellcode:
procedure SortData; { Aufsteigend sortieren }
var s : Array[1..20,1..2]of Integer; { Typ : Record          }
    i,j,l,r,sp : Integer;
    x : String[aa]; // Länge eintragen!!
    Hilf : tDataRec;
begin
  sp:=1;
  s[1,1]:=0;
  s[1,2]:=AnzData-1;
  while sp>0 do begin
    l:=s[sp,1];
    r:=s[sp,2];
    dec(sp);
    while r>l do begin
      i:=l;
      j:=r;
      x:=DataArray[(r+l)div 2].Name;
      while i<=j do begin
        while (DataArray[i].Name<x) and (i<r) do inc(i);
        while (DataArray[j].Name>x) and (j>l) do dec(j);
        if i<=j then begin
          Hilf:=DataArray[i];
          DataArray[i]:=DataArray[j];
          DataArray[j]:=Hilf;
          inc(i);
          dec(j)
          end;
        end;
      if (r-i) < (j-l) then
        if l<j then begin inc(sp);s[sp,1]:=l;s[sp,2]:=j;l:=i end
               else l:=i
                       else
        if i<r then begin inc(sp);s[sp,1]:=i;s[sp,2]:=r;r:=j end
               else r:=j
      end
    end
end;
Nach einlesen und sortieren der Daten kannst du nun das Array auf dem Bildschirm ausgeben (Array von 0 bis AnzData-1 durchlaufen). Wenn du nach dem Einfügen von Datensätzen den Sort erneut aufrufst und die Daten speicherst, ist natürlich auch die Datei nach dem Namen sortiert.

Ich habe das obenstehende NICHT mit TP7 getestet - das ist nun dein Part. Eine Frage zum Schluss muss ich dann aber doch loswerden: Wieso machst du das mit Turbo Pascal?

Gruß Ralph
Ralph
  Mit Zitat antworten Zitat