Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Shakersort
Breaks - Mi 04.01.06 20:54
Titel: Shakersort
Hallo,
Ich soll einen Vortrag über shakersort erstellen und ein
simples Programm mit einigen Zufallszahlen erstellen, welche mithilfe des Shakersort-Verfahrens sortiert werden.
Ich weiß ja, dass Shakersort eine Erweiterung von Bubblesort ist, doch habe ich noch nichts gefunden, was bei der Implementierung im Quelltext anders als bei Bubblesort ist*?*
Kann mir da einer helfen??
Thx, im Voraus. ;)
Moderiert von
raziel: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 04.01.2006 um 20:15
minnime - Mi 04.01.06 21:06
Eigentlich ganz einfach. Bubblesort arbeitet gewissermaßen unidirektional und Shakersort bidirektional. Mit Bubblesort wird die Liste nur von unten nach oben durchlaufen und dann fängt er unten wieder an, bei Shakersort geht er die Liste von oben nach unten wieder zurück.
Die entscheidende Stelle ist dabei die Schleife die die Bewegung der "Blase" durch die Liste vornimmt. Entweder gibt es zwei davon, die direkt hintereinander stehen und von der die letztere die Blase wieder absteigen lässt, oder es ist ein ein Umkehrmechanismus enthalten, der die Zählweise invertiert.[/i]
Edit: Da war einer schneller. Im in dem auf der Seite angeführten Code haben wir ein Beispiel mit zwei nacheinander durchlaufenen Schleifen.
Breaks - Mi 04.01.06 21:28
Titel: Quelltext
Hab mal versucht, funktioniert aber net richtig.
Könnt ihr mal gucken! ;)
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:
| procedure Tfeld.shakersort; var oben,unten,posoben,posunten,count,m,i,tausch:integer; begin
count:=0; repeat tausch:=0; for i:= count+1 to max-count-1 do if feld[i]>feld[i+1] then begin inc(tausch); m:=feld[i+1]; feld[i+1]:=feld[i]; feld[i]:=m; end; if (tausch>0) then for i:= max-count downto count+2 do if feld[i]<feld[i-1] then begin inc(tausch); m:=feld[i-1]; feld[i-1]:=feld[i]; feld[i]:=m; end; inc(count); until (tausch=0) or (count>=max div 2) end; |
Moderiert von
raziel: Delphi-Tags hinzugefügt
alzaimar - Mi 04.01.06 21:51
Ich mach das immer so:
Ich nehme mir eine kleine Liste mit, sagen wir, 5 Elemente, z.B. [5,3,1,4,2]
Dann gehe ich das PRogramm schrittweise durch (F7) und lasse mir die lokalen Variablen anzeigen ('watch').
Da ich ja weiss, wie das funktionieren soll, kann ich dann ganz leicht verifizieren, wo es hakt.
Breaks - Do 05.01.06 17:32
Bin totall am verzweifeln...
Hab jetzt einen Stringgrid mit 10 Zahlen und hab den Quelltext mir nen anderen Quelltext genommen. Er macht zwar was, aber er Sortiert kein bisschen! :(
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.Button2Click(Sender: TObject); var x, y, i, li, re :integer; hilf :string; begin
repeat for x:=9 downto 0 do begin if sg1.cells[x-1,0] > sg1.cells[x,0] then begin hilf:=sg1.cells[x,0]; sg1.cells[x,0]:=sg1.cells[x+1,0]; sg1.cells[x+1,0]:=hilf ; k:=x; end; end; li:=k+1 for x:=li to r do begin if sg1.cells[x-1,0] > sg1.cells[x,0] then begin hilf:=sg1.cells[x,0]; sg1.cells[x,0]:=sg1.cells[x+1,0]; sg1.cells[x+1,0]:=hilf; k:=x; end; end; r:=k-1; until li>r; end; |
könnt ihr ma guckn was da net stimmt?!
Moderiert von
raziel: Delphi-Tags hinzugefügt
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!