Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Problem mit Selection Sort
Paul - Mo 20.06.05 18:23
Titel: Problem mit Selection Sort
Hey Leute!
Ich hab ein Programm zu Selection Sort geschrieben. Das Problem daran ist, dass es zwar die Zahlen alle richtig sortiert, aber das sortierte Ergebnis mit in einem Schritt ausgibt. Ich soll es aber so programmieren, dass es jeden einzelnen Tauschschritt einzeln ein ein StrinGrid ausgibt. Aber WIE? Ich sitz schon ne ganze Woche an der Lösung, hab verschiedene Sachen ausprobiert, aber keine hat geholfen!
Also bitte bitte helft mir!
Danke schon im voraus.
Hier noch der Quelltext meiner Lösung:
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:
| procedure TForm2.BitBtn3Click(Sender: TObject); Var z,j,zmax,max:integer; begin Sort.cells[0,2]:='Sortiert'; for z:=10 downto 1 do begin zmax:=z; max:=zahl[z]; Sort.cells[z,2]:=IntToStr(max); for j:=1 to (z-1) do if zahl[j]>max then begin zmax:=j; max:=zahl[j]; Sort.cells[z,2]:=IntToStr(max); end; zahl[zmax]:=zahl[z]; zahl[z]:=max; Sort.cells[z,2]:=IntToStr(zahl[zmax]); Sort.cells[z,2]:=IntToStr(zahl[z]); end; end;
end. |
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt.
Moderiert von
Motzi: Topic aus VCL (Visual Component Library) verschoben am Mo 20.06.2005 um 19:34
Klabautermann - Mo 20.06.05 21:13
Titel: Re: Problem mit Selection Sort
Hallo,
wenn ich das richtig verstehe willst du nur die Zwischenschritte anzeigen.
Dafür solltest du in der inneren Schleife dein Programm auffordern, mal eine Pause zu machen um Dinge wie z.B. das Zeichnen des Fensters zu übernehmen. Hierdurch wird dein Algorytmus aber erheblich langsammer. Der Befehl dazu heißt
Application.ProcessMessages in deinem Programm muss das dann so aussehen:
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:
| procedure TForm2.BitBtn3Click(Sender: TObject); Var z,j,zmax,max:integer; begin Sort.cells[0,2]:='Sortiert'; for z:=10 downto 1 do begin zmax:=z; max:=zahl[z]; Sort.cells[z,2]:=IntToStr(max); for j:=1 to (z-1) do if zahl[j]>max then begin zmax:=j; max:=zahl[j]; Sort.cells[z,2]:=IntToStr(max); Application.ProcessMessages; end; zahl[zmax]:=zahl[z]; zahl[z]:=max; Sort.cells[z,2]:=IntToStr(zahl[zmax]); Sort.cells[z,2]:=IntToStr(zahl[z]); end; end;
end. |
Sollte das ganze dann immer noch zu schnell laufen, so das man es nciht richtig sieht, kannst du noch ein
sleep(250); direckt dahinter setzen. Damit wird nach jedem Durchlauf eine viertel Sekunde gewartet.
Gruß
Klabautermann
Paul - Mo 20.06.05 21:24
Titel: Super, funktioniert
Hab deine Lösung sofort ausprobiert, mit sleep funktioniert das spitzenmäßig. Danke dafür.
Ich hatte aber eigentlich vor, dass mir jeder Sortierschritt in eine neue Stringgridzeile ausgegeben wird, damit am Ende eine Art Schreibtischtest im Stringgrid vorliegt. Vielleicht gibts dafür auch ne Lösung?! Vielen Dank für deine Mühe!
Paul
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!