Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Sortier-Problem (Quicksort) (https://www.delphipraxis.net/162484-sortier-problem-quicksort.html)

Marcel2906 24. Aug 2011 15:52

Sortier-Problem (Quicksort)
 
Hab ein kleines Problem, hoffe es ist klein.
Ich will mein Array (=Liste) nach Ankunft sortieren.
Dieses Array besteht aus Records (=TBusEintrag) mit Linie, Ziel, Ankunft, Abfahrt, Zeit.
Nun soll nach der Ankunftszeit sortiert werden. Ich benutze dafür Quicksort.
Dies klappt auch, doch leider wird dann nur der Teil "Ankunft" sortiert und die anderen Sachen bleiben so stehen im Record. Ich möchte aber das ganze Record nach der Ankunft sortieren. Hoffe ihr versteht was ich meine. Hier mein Code von Quicksort und WerteTauschen:

Code:
procedure TForm1.WertTauschen(var Liste : Array of PBusEintrag; StelleA, StelleB: Integer);
   var tempI: TTime;
   begin
      tempI := Liste[StelleA].Ankunft;
      Liste[StelleA].Ankunft := Liste[StelleB].Ankunft;
      Liste[StelleB].Ankunft := tempI;
   end;
Code:
procedure TForm1.Quicksort(var Liste : Array of PBusEintrag; erstes,letztes:integer);
      var
      vonLinks, vonRechts, mitte:integer;
      vergleichsElement: TTime;

   begin
      if erstes < letztes then begin
         mitte := (erstes + letztes) div 2;
         vergleichsElement := Liste[mitte].Ankunft;
         vonLinks := erstes;
         vonRechts := letztes;

         while vonLinks <= vonRechts do begin {noch nicht fertig zerlegt?}
            while Liste[vonLinks].Ankunft < vergleichsElement do {linkes Element suchen}
               vonLinks := vonLinks + 1;
                  while Liste[vonRechts].Ankunft > vergleichsElement do {rechtes Element suchen}
                     vonRechts := vonRechts - 1;
                     if vonLinks <= vonRechts then begin
                        WertTauschen(Liste, vonLinks, vonRechts); {Elemente tauschen}
                           vonLinks := vonLinks + 1;
                           vonRechts := vonRechts - 1;
                     end;
      end;

      Quicksort(Liste, erstes, vonRechts); {li. und re. Teilfeld zerlegen}
      Quicksort(Liste, vonLinks, letztes);

     end;
   end;
Hoffe die Teile vom Code reichen, sonst einfach Nachfragen

Jumpy 24. Aug 2011 16:04

AW: Sortier-Problem (Quicksort)
 
Es kann sein, dass ich das Problem nicht verstehe, aber warum tauschst du nicht in der Tauschfunktion den ganzen Record? Irgendwie so:

Delphi-Quellcode:
procedure TForm1.WertTauschen(var Liste : Array of PBusEintrag; StelleA, StelleB: Integer);
   var tempI: TBusEintrag;
   begin
      tempI := Liste[StelleA];
      Liste[StelleA]:= Liste[StelleB];
      Liste[StelleB]:= tempI;
   end;

DeddyH 24. Aug 2011 16:55

AW: Sortier-Problem (Quicksort)
 
So isses. Und wenn PBusEintrag ein Zeiger ist (darauf lässt die Bezeichnung ja schließen), dann wird nicht der komplette Record umkopiert, sondern nur der Zeiger darauf, was die ganze Sache je nach Recordgröße enorm beschleunigt.

Uwe Raabe 24. Aug 2011 17:11

AW: Sortier-Problem (Quicksort)
 
Ich weiß nicht, ob es in D2010 auch schon geht, aber in XE kann man das alles auch so lösen:

Delphi-Quellcode:
uses
  Generics.Collections, Generics.Defaults, DateUtils;

var
  Liste: TArray<PBusEintrag>;
begin
  ...
  TArray.Sort<PBusEintrag>(Liste, TDelegatedComparer<PBusEintrag>.Create(
    function(const Left, Right: PBusEintrag): Integer
    begin
      result := CompareTime(Left, Right);
    end
  ));
  ...
end;

DeddyH 24. Aug 2011 17:17

AW: Sortier-Problem (Quicksort)
 
Außerdem verbleibt die Frage, ob der Ausbilder über Generics im aktuellen Wissensstand erfreut wäre ;)

Delphi-Laie 24. Aug 2011 22:55

AW: Sortier-Problem (Quicksort)
 
Ich verstehe nicht, warum die zu sortierende Liste immer komplett übergeben wird. Also bei der Rekursion reicht es doch völlig aus, nur die Intervallgrenzen zu übergeben?!

Marcel2906, schau Dir doch einfach in meinem Programm "Sortierkino" an, wie Quicksort funktioniert, und kopiere aus den dortigen Quelltexten nach Herzenslust!

Marcel2906 25. Aug 2011 07:26

AW: Sortier-Problem (Quicksort)
 
vielen dank für die guten Antworten. Nun funktioniert es :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz