Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mergesort (https://www.delphipraxis.net/38830-mergesort.html)

sveno2k5 24. Jan 2005 19:09


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:
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;
Gruss Sven

Matze 24. Jan 2005 19:29

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:

sveno2k5 24. Jan 2005 19:32

Re: Mergesort
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Matze
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:

Danke für die freundliche Begrüssung :hello:

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.

sveno2k5 24. Jan 2005 21:58

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