Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Mergesort


sid1985 - Di 05.04.05 18:40
Titel: Mergesort
Hallo,

bin relativ neu in der Delphi-Porgrammierung und suche nach einem fertig implementierten "Mergesort". Meine Suche bei Google war leider bisher relativ ergebnisslos, da bei dem Quellecode den ich finde meistens die rekursive Teilung am Anfang fehlt. Würde mich über jeden Link oder Sourcecode freuen.

ciao

Sid


Lannes - Di 05.04.05 22:38

Hallo,

kennst Du die Seite :?: :
http://www.sortieralgorithmen.de


sid1985 - Mi 06.04.05 11:31
Titel: Habe den Algorithmus jetzt geschrieben...
Danke für den Link, habe mir jetzt auf Grund dessen den Algorithmus geschrieben, allerdings läuft er nicht, er meldet mir immer wieder, dass er außerhalb des Indizes des Arrays kommt. Leider kann ich meinen Fehler nicht finden. Vielleicht hat jemand von euch mehr Glück.

Die Prozedure Mergesort:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
procedure TForm1.Mergesort(var Zahlen: array of integer; l,r: integer);
var z : integer;
begin
if (r-1) > 0 then
  begin
    Teiler:= (1+r) div 2; //Wir suchen uns die Mitte
    Mergesort(Zahlen,l,Teiler); //Teilt die hälften Links
    Mergesort(Zahlen,Teiler,r); //Teilt die rechten Hälften
    Merge(Zahlen,l,Teiler,r); //Siehe Prozedure Merge
  end;

for z:=1 to 25 do
    begin
    StringGrid1.Cells[z,1]:=inttostr (Zahlen[z]);
    end
end;

procedure TForm1.Merge(var Zahlen: array of integer; l,Teiler,r: integer);
var Hilfsarray : array[1..25] of integer;
var h1, h2, h3, h4, : integer;
begin

h1:=1;
h2:=(Teiler + 1);
h3:=l;

while (h1>=Teiler) and (h2<=r) do
  begin
    if Zahlen[h1]<= Zahlen[h2] then
      begin
      Hilfsarray[h3]:= Zahlen[h2];
      h1:= h1+1;
      end
    else
      begin
      Hilfsarray[h3]:= Zahlen[h2];
      h2:= h2+1;
      end;
    h3:= h3+1;
  end;

  if h1 > Teiler then
    for h4:= h1 to r do Hilfsarray[h3+h4-h2]:= Zahlen[h4]
  else
    begin
    for h4:= h1 to Teiler do Hilfsarray[h3+h4-h1]:= Zahlen[h4];
    for h4:= l to r do Zahlen[h4]:= Hilfsarray[h4];
   end;

end;


sid1985 - Mi 06.04.05 11:39
Titel: Hier noch die Fehlermeldung
Damit es vielleicht noch etwas deutlicher wird habe ich hier die Fehlermeldung angefügt!