Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem bei einem Sortierverfahren (https://www.delphipraxis.net/3900-problem-bei-einem-sortierverfahren.html)

Helios 4. Apr 2003 17:24


Problem bei einem Sortierverfahren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich programmiere gerade mit Delphi ein paar unterschiedliche Sortierverfahren. Ich bin zur Zeit noch beim ausprobieren, aber bei einem Verfahren komme ich einfach nicht weiter. Eigentlich ist es fertig, aber wenn ich es benutze, stürzt das programm immer ab. Hier der Quellcode:

Delphi-Quellcode:
procedure TForm1.Sortierverfahren4Click(Sender: TObject);
var
 n: integer;
 procedure Quicksort(links,rechts:integer);
 var
  el,er,grenze: integer;
  hilfe:string;
 begin
   el := links; er:=rechts; grenze := strtoint(ListeSortiert.Items.Strings[links]);

   repeat
      while strtoint(ListeSortiert.Items.Strings[el])<grenze do el:=el+1;
      while strtoint(ListeSortiert.Items.Strings[er])<grenze do er:=er-1;
      if(el <> er) then begin
        hilfe := ListeSortiert.Items.Strings[el];
        ListeSortiert.Items.Strings[el] := ListeSortiert.Items.Strings[er];
        ListeSortiert.Items.Strings[er] := hilfe;
      end;
   until el>er;
   if (er > links) then QuickSort(links,er);
   if (el < rechts) then QuickSort(el,rechts);
 end;
Vielleicht kann mir jemand helfen. Die Dateien sind in einer Zip-Datei als Attachment hinzugefügt, falls jemand Interesse haben sollte den Fehler zu beheben.
Gruß
Helios

Luckie 4. Apr 2003 17:29

In der Tutorial-Sparte hat Daniel ein paar Sortierverfahren besprochen. Da schon mal gekuckt?

Daniel B 4. Apr 2003 17:55

Hallo und herzlich Willkommen im Forum!

Das problem ist folgende zeile:
Delphi-Quellcode:
until el>er;
el wird nie höher und somit hast Du da eine Endlosschleife. Dein el wird nie erhöht. er ist ja 4 und el ist ja immer 1, kann also nicht gehen.

Grüsse, Daniel :hi:

Helios 4. Apr 2003 18:02

Danke für den Tipp. Aber ich weiß jetzt noch nicht, was ich ändern muss, damit "el" so erhöht wird, dass es funktioniert. Wäre gut wenn du vielleicht einen Lösungsvorschlag hast. :coder:

Luckie 4. Apr 2003 18:05

Ich zitiere mich ungern selber:
Zitat:

In der Tutorial-Sparte hat Daniel ein paar Sortierverfahren besprochen. Da schon mal gekuckt?

Daniel B 4. Apr 2003 18:05

Hallo,

nun, das einfachste wäre:
Delphi-Quellcode:
      Inc(el);
    until el>er;
So bleibt man wenisgtens nicht mehr hängen. ;)

Grüsse, Daniel :hi:

Helios 4. Apr 2003 18:24

@Luckie: Da hab ich eben mal geguckt. Nur sieht der Quellcode von dem Verfahren, an dem ich arbeite dort ganz anders aus. Ich kann zumindest nichts damit anfangen, weil ich noch nicht lange mit Delphi programmiere. Und diesen Quellcode, den ich hier habe, ist von meinem Informatiklehrer. Eigentlich sollte es funktionieren, aber mein Lehrer hat sich auch gewundert als es nicht ging. Und nun sollen wir zuhause versuchen das Problem zu lösen...

Helios 4. Apr 2003 18:49

Dein Tipp mit:
Delphi-Quellcode:
Inc(el);
until el>er;
hilft mir auch nicht weiter.
ich bin aber auf eine andere Idee gekommen. Es müsste doch eigentlich wie folgt sein:
Delphi-Quellcode:
el:=el+1;
er:=er-1;
until el>er;
Es funktioniert auch, fast zumindest. Wenn ich z.B. eine Liste mit 12 Zahlen nehme sind fast alle richtig sortiert. Meistens sind so ca. 10 von 12 Zahlen richtig sortiert. Aber warum werden nicht alle sortiert? :?: :?: :?: :!: :(

Daniel B 4. Apr 2003 18:52

Zitat:

Zitat von Helios
Dein Tipp mit:
Delphi-Quellcode:
Inc(el);
until el>er;
hilft mir auch nicht weiter.

Und was meinst Du was
Delphi-Quellcode:
Inc(el)
und
Delphi-Quellcode:
Dec(er)
macht??
Inc zählt die Varibale hoch, ist also das gleiche wie i := i +1; und Dec macht genau das Gegenteil, es zählt runter!

Grüsse, Daniel :hi:

Helios 4. Apr 2003 19:24

Ok, aber was kann ich nun mache, damit die Liste komplett sortiert wird. Damit die Liste komplett richtig sortiert wird muss ich das Verfahren mehrmals hintereinander anwenden...

Daniel B 4. Apr 2003 19:29

Mach es doch vorsichtshalber! mal so lange wie Einträge in der ListBox sind, also:
Delphi-Quellcode:
for i := o to ListBox.Items.Count -1
Grüsse, Daniel :hi:

Helios 4. Apr 2003 19:59

Aber wie oft ich sortieren muss, ist unabhängig von der Anzahl der zu sortierenden Zahlen. Wenn ich z.B. nur 12 Zahlen habe, kann es sein, dass ich 4x sortieren muss. Wenn ich z.B. 100 zahlen habe, kann es sein, dass ich nur 3x sortieren muss. Den Vorgang einfach automatisch mehrmals wiederholen lassen, ist ja nicht wirklich die richtige Lösung. Da muss es doch noch eine bessere Möglichkeit geben.

Dein Vorschlag funktioniert zwar:
Delphi-Quellcode:
for i := o to ListBox.Items.Count -1
Nur kann man dann das Sortierverfahren nicht mehr als Quicksort bezeichnen. Es ist so bei großen Zahlenmengen wirklich extrem langsam :wink: :( :?:

Helios 5. Apr 2003 10:55

Hier noch mal die aktuelle Version des Quellcodes. Es gibt immernoch das gleiche Problem: Damit die Liste komplett sortiert ist, muss ich das Sortierverfahren mehrmals anwenden. Vielleicht hat ja jemand noch ein paar Tipps.
Delphi-Quellcode:
procedure TForm1.Sortierverfahren4Click(Sender: TObject);
var
 n:integer;
 timer_s_ts,timer_e_ts:ttimestamp;
 procedure Quicksort(links,rechts:integer);
 var
  el,er,grenze: integer;
  hilfe:string;
 begin
  el:=links; er:=rechts; grenze:=strtoint(ListeSortiert.Items.Strings[links]);

   repeat
      while strtoint(ListeSortiert.Items.Strings[el])<grenze do el:=el+1;
      while strtoint(ListeSortiert.Items.Strings[er])>grenze do er:=er-1;
      if(el <= er) then begin
        hilfe:=ListeSortiert.Items.Strings[el];
        ListeSortiert.Items.Strings[el]:=ListeSortiert.Items.Strings[er];
        ListeSortiert.Items.Strings[er]:=hilfe;
      end;
      el:=el+1;
      er:=er-1;
   until el>=er;
   if (er > links) then QuickSort(links,er);
   if (el < rechts) then QuickSort(el,rechts);
 end;
begin
timer_s_ts:=DateTimeToTimeStamp(now());
 Write;
 n:=ListeSortiert.Items.Count-1;
 Quicksort(0,n);
timer_e_ts:=DateTimeToTimeStamp(now());
GebrauchteZeit.Text:=inttostr((timer_e_ts.Date*24*60*60*1000+timer_e_ts.Time)-(timer_s_ts.Date*24*60*60*1000+timer_s_ts.Time));
end;


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