![]() |
Mergesort
Hallo.
Habe versucht den mergesort zu programmieren, aber es klappt nicht. Eine und 2 Zahlen sortiert er noch korrekt, aber sobald die Gröse der zu sortierenden Zahlen grösser als 2 ist bricht Delphi ab. Weiss jemand woran das liegt?
Delphi-Quellcode:
procedure TFrmbubble.btmergeClick(Sender: TObject);
var zeit, start: integer; cursor: TCursor; begin cursor := screen.Cursor; Screen.Cursor := crHourGlass; try start := 1; sortfeld := zufallsfeld; starte_zeit(Zeit); merge_sort(start,anzahl); stoppe_zeit(Zeit); anzahl := SpEdAnzahl.Value; kopieresortfeldzustrgrd; lbmsmerge.caption := inttostr(Zeit); finally Screen.Cursor := cursor; end; end;
Delphi-Quellcode:
Gruss Sven
procedure merge_sort(anfang, ende: integer);
var hilfsfeld: TFeld; i,x,y,mitte, mitterechts: integer; begin IF ende > anfang THEN begin mitte := (anfang + ende) DIV 2; mitterechts := mitte + 1; merge_sort(anfang,mitte); merge_sort(mitterechts,ende); x := anfang; y := mitterechts; FOR i := Anfang TO ende DO begin IF sortfeld[x] < sortfeld[y] THEN begin hilfsfeld[i] := sortfeld[x]; sortfeld[x] := 1001; IF x < mitte THEN inc(x); end ELSE begin hilfsfeld[i] := sortfeld[y]; sortfeld[y] := 1001; IF y < ende THEN inc(y); end; end; FOR i := anfang TO ende DO sortfeld[i] := hilfsfeld[i]; end; end; |
Re: Mergesort
Hab's nur schnell überflogen, kann es sein, dass es daran liegt:
Delphi-Quellcode:
start := 1;
sortfeld := zufallsfeld; starte_zeit(Zeit); merge_sort(start,anzahl); //<== Hier übergibst du "anzahl" stoppe_zeit(Zeit); anzahl := SpEdAnzahl.Value; //<== aber erst hinterher weist du "anzahl" einen Wert zu Nachtrag: Herzlich willkommen in der DP! :party: |
Re: Mergesort
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Daran liegts aber nicht, anzahl ist global deklariert und wird beim Button neu (den man vorher klicken muss um überhaupt ne zahlenreihe sortieren zu lassen) initialisiert. Gruss Sven:) *edit* Hab mal das Prog beigefügt, dann kann man glaub ich besser erkennen wod er Fehler liegt. |
Re: Mergesort
Problem ist gelöst:)
Ich musste nur das hilfsfeld global und nicht lokal deklarieren, weil es sonst bei jedem Rekursionsaufruf neu generiert wird und es zum Stack Überlauf kommt:) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 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