Der Shakersort stellt eine geringfügige Verbesserung des Bubblesorts dar: Um weit von der richtigen Stelle liegende Elemente schneller einzusortieren, wird nach jedem Durchlauf die Laufrichtung umgekehrt. Die ``schüttelnde'' Bewegung des Verfahrens hat dem Algorithmus wohl seinen Namen verliehen...
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class Shaker extends Frame {
int h[] = new int[101];
public Shaker() {
int i;
Random r = new Random();
for (i=1; i<=100; i++) {
h[i] = (int) (r.nextDouble()*80);
}
}
public void paint (Graphics g) {
int i;
int j;
int l;
int r;
int k;
int hilfsvar;
g.setColor(Color.white);
g.fillRect(0,0,520,120);
g.setColor(Color.black);
for (l=1;l<=100;l++) {
g.fillRect(l*5,120-h[l],3,h[l]);
}
l=2;
r=100;
k=100;
do {
for (j=r;j>=l;j--) {
for (int pause=1;pause<100000;pause++) {}
if (h[j-1]>h[j]) {
hilfsvar=h[j-1];
h[j-1]=h[j];
h[j]=hilfsvar;
k=j;
g.setColor(Color.white);
g.fillRect((j-1)*5,20,5,100);
g.fillRect(j*5,20,5,100);
g.setColor(Color.black);
g.fillRect((j-1)*5,120-h[j-1],3,h[j-1]);
g.fillRect(j*5,120-h[j],3,h[j]);
}
}
l=k+1;
for (j=l;j<=r;j++) {
for (int pause=1;pause<100000;pause++) {}
if (h[j-1]>h[j]) {
hilfsvar=h[j-1];
h[j-1]=h[j];
h[j]=hilfsvar;
k=j;
g.setColor(Color.white);
g.fillRect((j-1)*5,20,5,100);
g.fillRect(j*5,20,5,100);
g.setColor(Color.black);
g.fillRect((j-1)*5,120-h[j-1],3,h[j-1]);
g.fillRect(j*5,120-h[j],3,h[j]);
}
}
r=k-1;
} while (l<=r);
}
public static void main (String [] args) {
...
}
}
Das Sortieren durch Austauschen ist jedenfalls ungünstiger als das Sortieren durch Einfügen und schlechter als das Sortieren durch Auswählen.