20.05.2012

Shell Sort

ShellSort ist ein von Donald L. Shell entwickelter Sortieralgorihtmus aus dem Jahre 1959. Er basiert auf dem Prinzip von InsertionSort.

  • basiert auf InsertionSort mit den Vor- und Nachteilen
  • in-place (bzw. in-situ, d.h. es wird kein zusätzlicher Speicher benötigt)

Idee

InsertionSort ist sehr effizient bei genügend vorsortierten Daten, aber langsam, weil Elemente pro Iterationsschritt nur maximal um eine Position bewegt werden. ShellSort verbessert nun InsertionSort indem Elemente, die eine bestimmte Entfernung voneinander entfernt sind (gap size), vergleicht und sie notfalls vertauscht. Die gap size wird nach jeder Iteration verringert, sodass der nächste Iterationsschritt auf leicht vorsortierten Daten basiert.

Um dies bildlich zu veranschaulichen, behilft man sich einer Matrixdarstellung mit k Spalten, wobei k die gap size repräsentiert. Jede Spalte wird dann separat mit dem InsertionSort sortiert. Dies geschieht vergleichsweise schnell auf diesen kleinen Datensätzen. Im nächsten Schritt wird die gap size verringert ung der Algortihmus wiederholt. Im letzten Schritt liegt eine einspaltrige Matrix vor, worauf ein InsertionSort eine sortierte Folge garantiert und zudem schnell ablaufen sollte, da sie nun genügend vorsortiert sein müsste.

Applet

© Miao Wang 2006 (Bug-Meldungen bitte an Webmaster@Wanginator.de richten)

Das Applet (benötigt Java) visualisiert einen ShellSort auf maximal 16 Elemente. Der Algorithmus läuft wie oben beschrieben ab, wobei nun kedoch die Zeilenanzahl (anstatt die Spaltenanzahl) gap size gewählt wurde, damit das Applet gut auf die Seite passt. Mit Insert lassen sich Werte zur Folge hinzufügen, mit Random Fill erhält man eine zufällige volle Folge generiert und mit Clear löscht man die aktuelle Folge. Mit einem Klick auf Sort wird stets ein Schritt des Verfahrens visualisiert.

Quellcode (Java)

Java Code:
Syntax Highlightning by Beautifier
public class ShellSort { public static void shellsort (int[] a) { int i, j, k, h, t; //vordefinierte gute gap sizes (können verändert werden) int cols[] = {4711, 1968, 815, 271, 111, 41, 13, 4, 1}; for (k=0; k<cols.length; k++) { //gap size auslesen h = cols[k]; //vertauschen, falls in falsche Reihenfolge for (i=h; i<a.length; i++) { j = i; t = a[j]; while (j>=h && a[j-h]>t) { a[j] = a[j-h]; j = j-h; } a[j] = t; } } } }

Varianten

Combsort ist ein ähnliches Sortierverfahren, welches statt dem InsertionSort eine Iteration des BubbleSort benutzt um die Spalten vorzusortieren.

Analyse

Die Laufzeit von ShellSort zu analysieren ist sehr schwer und gehen von O(n log2 n) bis O(n1.5) je nach Implementation. Sie hängt vor allem von der Wahl der gap sizes ab. Die Folge 1, 3, 7, 15, 31, 63, ..., 2k-1 führt zu einer Laufzeit von O(n1.5), die Folge 1, 2, 3, 4, 6, 8, 9, 12, 16, ..., 2p3q jedoch zu einer Laufzeit von O(n log2 n). Es kann gezeigt werden, dass die durchschnittliche Laufzeit bei etwa O(n1.25) liegt, aber ein Beweis für ein O(n log n) WorstCase wurde noch nicht gefunden.

Further References

Weiterführende Links und Literatur

Last Update: 05.04.2011 02:46:53
Valid XHTML 1.0 Transitional!Valid CSS!