Slowsort (von engl. slow: langsam) ist ein langsamer, rekursiver Sortieralgorithmus, der nach dem Prinzip Vervielfache und kapituliere (engl. Multiply and surrender, eine Parodie auf Teile und herrsche) arbeitet. Er wurde 1986 von Andrei Broder und Jorge Stolfi in ihrer (nicht ganz ernst gemeinten) Veröffentlichung Pessimal Algorithms and Simplexity Analysis vorgestellt.
Slowsort ist ein rekursiver Algorithmus, der in folgenden Schritten arbeitet:
Dabei wird der erste Schritt nach dem Prinzip Vervielfache und kapituliere in mehrere geringfügig einfachere Schritte unterteilt:
Dies wird rekursiv wiederholt, bis das Teilfeld nur noch ein einziges Element enthält und die Lösung somit nicht weiter hinausgezögert werden kann.
procedure slowsort(A,i,j) // Sortiert das Array A[i],...,A[j] if i >= j then return m := floor((i+j)/2) // abrunden, falls i+j ungerade slowsort(A,i,m) // (1.1) slowsort(A,m+1,j) // (1.2) if A[j] < A[m] then vertausche A[j] und A[m] // (1.3) slowsort(A,i,j-1) // (2)
Die ersten fünf Zeilen vom Pseudocode unterscheiden sich dabei nicht von Mergesort, und nur das Vereinigen der beiden sortierten Teilfelder geschieht (anstelle eines effizienten Mischens) durch einen extrem ineffizienten rekursiven Aufruf.
Die Korrektheit lässt sich relativ einfach durch vollständige Induktion über die Anzahl der Elemente zeigen.
Des Weiteren ist Slowsort kein stabiles Sortierverfahren: Bei der Eingabe (1, 3, 2a, 2b) wird auf der ersten Rekursionsstufe 3 mit 2b vertauscht. Im weiteren Verlauf findet dann keine weitere Vertauschung mehr statt, so dass Slowsort mit der Ausgabe (1, 2b, 2a, 3) terminiert.
Die Laufzeit für Slowsort genügt der Rekursionsgleichung . Eine untere asymptotische Grenze für ausgedrückt in der Landau-Notation ist für ein beliebiges . Der Algorithmus ist daher nicht polynomiell. Slowsort ist somit auch im best case ineffizienter als z. B. Bubblesort mit einer Komplexität von .
Im Gegensatz dazu benötigt Bubblesort mindestens so viele Vertauschungen wie Slowsort. Ein Maß, wie „stark“ ein Feld mit Elementen sich von dem sortierten Feld unterscheidet, ist die Anzahl an Fehlständen, also die Anzahl Paare mit für die gilt.
Bei einem Tausch bei Bubblesort vermindert sich die Anzahl der Fehlstände um genau eins, während sie sich bei Slowsort um mindestens eins (um genau eins, falls alle Werte im Feld verschieden sind) verringert. Die Anzahl an Fehlständen ist daher eine obere Schranke für die Anzahl an Vertauschungen von Slowsort, da genau ein sortiertes Feld keine Fehlstände hat. Die maximale Anzahl an Vertauschungen bei einem Feld mit Elementen beträgt bei Slowsort daher maximal und zwar genau dann, wenn es absteigend sortiert ist. Innerhalb eines rekursiven Aufrufes findet deshalb nur in den seltensten Fällen überhaupt eine Vertauschung statt.