Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi quicksort hängt sich auf (https://www.delphipraxis.net/122357-quicksort-haengt-sich-auf.html)

rory fluegler 14. Okt 2008 21:09


quicksort hängt sich auf
 
hallo, ich hab ein problem mit quicksort... das programm hängt sich beim sortieren auf. wäre toll, wenn ihr mir schnell antworten könntet..

Delphi-Quellcode:
procedure TForm1.Quicksort (l,r:Integer);
var i,j,Merke,Mitte: Integer;
begin
  i:= L;
  j:= R-1;
  Mitte:= Wert[(L+R)div 2];

  //vergleich
  repeat
  while (Mitte <= Wert[j]) and (j>i) do
  begin
    dec (j);
    counter_Vergleich:=counter_Vergleich+1;
  end;
  while (Mitte >= Wert[i]) and (i<j) do
  begin
    inc (i);
    counter_Vergleich:=counter_Vergleich+1;
  end;

  //tauschen
  if i > j then
  begin
      Merke:=Wert[i];
      Wert[i]:= Wert[j];
      Wert[j]:= Merke;
      counter_Tausch:=counter_Tausch+1;
  {if j > i then
    dec (j);}
  end;

  until i < j;

  //Rekursion

  Quicksort(i+1,R);
  Quicksort(L,j-1);

end;
schon mal vielen dank.

lg

DelphiDeveloper 14. Okt 2008 21:58

Re: quicksort hängt sich auf
 
Dann schau Dir mal den Source in der Delphi VCL an:

z.b. ListAcnts.pas (muesste auch bei Delphi 5 im Verzeichnis ..Source\Vcl liegen

Hier ein kleiner Auschnitt:

Delphi-Quellcode:
procedure TListControlItems.QuickSort(L, R: Integer; SCompare: TListItemsCompare);
var
  I, J, P: Integer;
begin
  repeat
    I := L;
    J := R;
    P := (L + R) shr 1;
    repeat
      while SCompare(Self, I, P) < 0 do Inc(I);
      while SCompare(Self, J, P) > 0 do Dec(J);
      if I <= J then
      begin
        ExchangeItems(I, J);
        if P = I then
          P := J
        else if P = J then
          P := I;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then QuickSort(L, J, SCompare);
    L := I;
  until I >= R;
end;
Dann wirst du deinen Algo auch lauffähig kriegen.

mfg
Delphideveloper

Noobinator 15. Okt 2008 06:56

Re: quicksort hängt sich auf
 
Dein Code ist ja soweit In Ordnung.

Wenn sich das Programm "aufhängt" also nicht mehr Reagiert, deutet das ziemlich wahrscheinlich auf eine Endlosschleife/Endlosrekursion hin.

bei dir eher ne Endlosrekursion, aber den Fehler solltest du mit dem Code von DelphiDeveloper schnell finden ;)

QuickAndDirty 15. Okt 2008 07:38

Re: quicksort hängt sich auf
 
Du rufst immer wieder die Rekursion auf.
Da muss eine Bedingung rein wann du damit aufhören musst, eine so genannte Abbruchbedingung.

alzaimar 15. Okt 2008 08:14

Re: quicksort hängt sich auf
 
Abbruchbedingung: Beim Quicksort unterteilst Du die Liste L in zwei Teillisten A und B, wobei jedes Element aus A kleiner als jedes Element aus B ist. Anschließend rufst Du Quicksort für A und B auf.

Bei Dir fehlt die Abfrage, ob A und B leer sind bzw. nur aus einem Element besteht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 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