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 user profile iconraziel: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 04.01.2006 um 20:15


F34r0fTh3D4rk - Mi 04.01.06 21:03

2. ergebnis bei google:

http://www.stefan-baur.de/cs.algo.shakersort.html


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
{
//shakersort II
oben:=max;
posoben:=max-1;

repeat
  tausch:=0;
  unten:=posoben;
  for i:= unten to oben-1 do
    if feld[i]>feld[i+1] then
      begin
      inc(tausch);
      posunten:=i;
      m:=feld[i+1];
      feld[i+1]:=feld[i];
      feld[i]:=m;
      end;

  oben:=posunten;
  for i:= oben downto unten+1 do
    if feld[i]<feld[i-1] then
      begin
      inc(tausch);
      posoben:=i;
      m:=feld[i-1];
      feld[i-1]:=feld[i];
      feld[i]:=m;
      end;

until (tausch=0)}


count:=0;
repeat
  tausch:=0;
  for i:= count+1 to max-count-1 do
    if feld[i]>feld[i+1then
      begin
      inc(tausch);
      m:=feld[i+1];
      feld[i+1]:=feld[i];
      feld[i]:=m;
      end;
  if (tausch>0then
    for i:= max-count downto count+2 do
      if feld[i]<feld[i-1then
        begin
        inc(tausch);
        m:=feld[i-1];
        feld[i-1]:=feld[i];
        feld[i]:=m;
        end;
  inc(count);
until (tausch=0or (count>=max div 2)
end;


Moderiert von user profile iconraziel: 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,0then 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,0then 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 user profile iconraziel: Delphi-Tags hinzugefügt