Entwickler-Ecke

Algorithmen, Optimierung und Assembler - BubbleSort Probleme


CurdledMilk - Mi 30.11.05 18:34
Titel: BubbleSort Probleme
Hallo!

Ich habe Versucht einen BubbleSort Alg. zu schreiben. Doch leider Sortiert der nich.

Hier is der Quelltext des Sortieralg. Ich hoffe ihr könnt mir Helfen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.sortieren;
var max, n, s,i,c : integer;
    a: array[1..256of integer;

begin
max := tab.colcount;
 for i:=1 to max do begin
 a[i]:=strtoint(tab.Cells[i,1]);
 end;
  for n:=1 to max do begin
   for s:= 1 to n-1 do begin
    if a[s] > a[s+1then
    begin
    a[s] := a[s+1];
    end
    end;
  end;
for c:=1 to max do begin
tab.cells[1,c]:=inttostr(a[c]);
end;


muschelschubser - Mi 30.11.05 18:55

Holla,

ich mag mich irren, aber muss du die Zellen nicht vertauschen statt einfach nur nach unten zu verschieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
    
if a[s] > a[s+1then
    begin
    a[s] := a[s+1];
end


also sowas wie:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  
if a[s] > a[s+1then
    begin
    Temp := a[s];
    a[s] := a[s+1];
    a[s+1] := Temp;
    end


oder eleganter eine kleine "switch" funktion bauen und dann:


Delphi-Quelltext
1:
2:
3:
4:
5:
    
if a[s] > a[s+1then
    begin
    switch(a[s],a[s+1]);
end



gruß,
schubser


CurdledMilk - Mi 30.11.05 19:07

jo klar stimmt schon, danke ... aber jetzt ist das Problem noch viel problematischer.

der sortiert jetzt fehlerhaft... grad gegen Ende kommt es immer wieder zu Fehlern. Also der Sortiert z.B. 100 werte richtig und dann kommen z.B. wieder ein Paar niedrigere werte

mein Quelltext jetzt:


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:
procedure TForm1.sortieren;
var max, n, s,i,c, sp : integer;

    a: array[1..256of integer;

begin
max := tab.colcount;
 for i:=1 to max do begin
 a[i]:=strtoint(tab.Cells[i,1]);
 end;
  for n:=1 to max do begin
   for s:= 1 to n-1 do begin
    if a[s] > a[s+1then
    begin
    sp:= a[s];
    a[s] := a[s+1];
    a[s+1] := sp;
    sp:= 0;
    end
    end;
  end;
for c:=1 to max do begin
tab.cells[c,1]:=inttostr(a[c]);
end;

end;


muschelschubser - Do 01.12.05 11:45
Titel: Hm... hier wirst du geholfen ;-)
Hallo,

ich glaub der Fehler steckt hier:


Quelltext
1:
2:
  for n:=1 to max do begin
   for s:= 1 to n-1 do begin


Wieso sortierst du nur bis n-1 und vor allem von "unten" beginnend?

Du musst eigentlich so vorgehen, das im ersten Durchlauf das höchste element ganz "nach oben" sortiert wird. Dann im zweiten durchgang das zweithöchste bis auf den "vorletzten" Platz, usw...

Also erste "Aussenschleife" bis max, zweite Aussenschleife bis max-1, dritte bis max-2, ...

Dieser Beitrag erklärt das eigentlich ganz gut: Bubblesort + optimierter Bubblesort [http://www.delphi-forum.de/viewtopic.php?p=202554#202554]

Damit sollte dir dann geholfen sein.

gruß,
schubser