Autor Beitrag
MJ87
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21

Win XP
D5 Pro
BeitragVerfasst: Di 22.11.05 21:59 
Hallo,

habe eine Merge sort programmiert, dabei wird allerdings immer nur die erste Zahl aus der eingegeben Liste in die auszugebende Liste geschrieben

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:
procedure TForm1.merge_sort(anfang, ende: integer);
var
    i: integer;
begin
if ende > anfang then
 begin
    setlength(hilfsfeld,ende+1);
    mitte := (anfang + ende) div 2;
    mitte2:=mitte+1;
    merge_sort(anfang,mitte);
    merge_sort(mitte2,ende);
    m:=mitte+1;
    a:=anfang;
  for i := Anfang to ende do
  begin
   if  sortfeld1[a] < sortfeld1[m] then
   begin
     hilfsfeld[i] := sortfeld1[a];  
    if anfang < mitte then
      inc(a);
   end
     else
       begin
         hilfsfeld[i] := sortfeld1[m];
           if mitte+1 < ende then
             inc(m);
       end;
  end;
  for i := anfang to ende do
   sortfeld1[i] := hilfsfeld[i];
 end;
end;


Kann mir jemand sagen, wo der Fehler liegt???

Danke!!!

Gruß MJ87
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Di 22.11.05 22:47 
Hallo,

ich habe mich auch gerade mit mergesort herumgeaegert, aber es ist in meinem Fall (bisher) das schnellste, was ich zustande gebracht habe.

Du musst Dir vorstellen wie Du die Daten zusammenfuehren willst und was Du geschrieben hast:
Du willst Die zwei Haelften aus Sortfeld ins Hilfsfeld kopieren.
Du benutzt m als Index fuer die obere Haelfte und a fuer die untere.
Du willst die Daten aus dem unteren Feld SortFeld[a] ins Hilfsfeld schreiben, sowie Sie kleiner als das momentane Element SortFeld[m] ist.
Du moechtest damit aufhoeren a zu erhoehen, wenn a = Mitte ist.
Aber jetzt kommt der Fehler, wenn Sortfeld[mitte] auch kleiner als Sortfelf[m] ist, dann schreibst Du fleissig in Hilfsfeld[i] = Sortfeld[mitte].
Zum Beispiel schon aufsteigend sortiert:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Sortfeld = (1,2,3,4,5,6)
a= 0 ,mitte= 5 div 2 = 2; m=3
i   a   m   S[a]  S[m] H[i]
0   0   3     1    4    1    S[a]< S[m] a wird erhoeht
1   1   3     2    4    2    S[a]< S[m] a wird erhoeht
2   2   3     3    4    3    S[a]< S[m] a wird nicht mehr erhoeht
3   2   3     3    4    3    S[a]< S[m] a wird nicht mehr erhoeht
4   2   3     3    4    3    S[a]< S[m] a wird nicht mehr erhoeht
5   2   3     3    4    3    S[a]< S[m] a wird nicht mehr erhoeht
6   2   3     3    4    3    S[a]< S[m] a wird nicht mehr erhoeht


Das ist eben beim sortieren durch mischen so.
Wenn man ein Feld leergeraeumt hat muss man die Schleife verlassen und das jeweilige Restfeld einfach nur noch Stueck fuer Stueck in das Hilfsfeld uebertragen.

Es gibt eine schoene Variante, bei der man mit einem Hilfsfeld halber Groesse arbeitet, und sich keine Gedanken mehr machen braucht, welches Haelfte geread leergeraeumt wurde.

Einfach hier mal durchlesen und mit der Maus die richtigen Zahlen anklicken.

Gruss Horst