Autor Beitrag
Platinum
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Sa 09.05.09 15:48 
Hallo,

Ich will den MergeSort Algorithmus programmieren, aber irgendwie klappts nicht :X Ich bleibe beim übergeben meines Arrays an mein Hilfsarray hängen (bzw. bei der 2ten hälfte des übergebens :P). Der Misch schritt ist ausgeklammert, ob der so richtig ist weiß ich nicht, werde da durch die try&error methode schlauer werden :D (hoffe ich zumindest).

Sieht jemand den Fehler ? :X

ausblenden volle Höhe Delphi-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:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

Type
  TListe = array[1..100of integer;
  Var
  i:integer;
  l,r:extended;
  Liste:TListe;


  procedure Merge(m:integer; l,r:extended; var Liste:Tliste);    // das ist der Misch-Schritt
  Var
  i,j,k:integer;
  b:TListe;
      begin

       for i:= TRUNC(l) to m do b[i]:=Liste[i];
       for j:= m+1 to TRUNC(r) do b[i]:=Liste[i];
       for i:= TRUNC(l) to TRUNC(r) do writeln(i,'.) ',b[i]);//<--- ich gebe mir testweise die Werte von meinem
       writeln;                                              // Hilfsarray aus, ab dem 7 Wert kommt nur noch mist   
       i:=TRUNC(l);                                          // raus, aber ich weiß nicht warum :(  
       j:=TRUNC(r);

     (* While (i<=m) and (j<=r) do
       begin
         for k:= TRUNC(l) to TRUNC(r) do
           begin
             if b[i]<b[j]
               then
                 begin
                 Liste[k]:=b[i];
                 i:=i+1;
                 end
               else
               begin
                 Liste[k]:=b[j];
                 j:=j+1;
                 end;
           end;
       end;  *)

     end;

  procedure Mergesort(l,r:extended; var Liste:Tliste);    //das ist der Teile Schritt
  Var
  m:integer;
    begin
    if l<r then
     begin

       m:=TRUNC((l+r)/2);
       Mergesort(l,m,Liste);
       Mergesort(m+1,r,Liste);
       merge(m,l,r,Liste);

    end;
    end;

    
begin
  { TODO -oUser -cConsole Main : Hier Code einfügen }
  l:=1;
  r:=10;

  randomize;
  for i:= TRUNC(l) to TRUNC(r) do Liste[i]:=(TRUNC(r)-i);
  writeln;
  Mergesort(l,r,Liste);

  readln;
end.
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Sa 09.05.09 17:29 
Also ich nehme mal an, dass Du das ganze vorher durch einen Algorythmus gejagt hast, wie z.B. diesen hier:
Delphi-Library.de » Algorithmen, Optimierung und Assembler » (perfektes) Mischen nach Fisher-Yates (perfect shuffle)"
Der geht zumindest ziemlich schnell und ist auch effektiv.

Und für Dein konkretes Thema gibt es zum Beispiel diesen Link:
forum.delphi-treff.d...owthread.php?t=26407

Ansonsten ähnelt das Problem sich doch recht doll diesem hier:
merged Array in ListBox einfügen?
...wo auch auf delphi-treff hingewisen wird.