![]() |
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:
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.
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; Gruß Helios |
In der Tutorial-Sparte hat Daniel ein paar Sortierverfahren besprochen. Da schon mal gekuckt?
|
Hallo und herzlich Willkommen im Forum!
Das problem ist folgende zeile:
Delphi-Quellcode:
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.
until el>er;
Grüsse, Daniel :hi: |
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:
|
Ich zitiere mich ungern selber:
Zitat:
|
Hallo,
nun, das einfachste wäre:
Delphi-Quellcode:
So bleibt man wenisgtens nicht mehr hängen. ;)
Inc(el);
until el>er; Grüsse, Daniel :hi: |
@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...
|
Dein Tipp mit:
Delphi-Quellcode:
hilft mir auch nicht weiter.
Inc(el);
until el>er; ich bin aber auf eine andere Idee gekommen. Es müsste doch eigentlich wie folgt sein:
Delphi-Quellcode:
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? :?: :?: :?: :!: :(
el:=el+1;
er:=er-1; until el>er; |
Zitat:
Delphi-Quellcode:
und
Inc(el)
Delphi-Quellcode:
macht??
Dec(er)
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: |
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...
|
Mach es doch vorsichtshalber! mal so lange wie Einträge in der ListBox sind, also:
Delphi-Quellcode:
Grüsse, Daniel :hi:
for i := o to ListBox.Items.Count -1
|
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:
Nur kann man dann das Sortierverfahren nicht mehr als Quicksort bezeichnen. Es ist so bei großen Zahlenmengen wirklich extrem langsam :wink: :( :?:
for i := o to ListBox.Items.Count -1
|
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 17:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz