Stoogesort

Stooge sort ist ein rekursiver Sortieralgorithmus nach dem Divide-and-Conquer-Verfahren.

Inhaltsverzeichnis

Prinzip

Komplexität

Der Algorithmus besitzt eine im Vergleich zu anderen Sortieralgorithmen sehr schlechte Worst-Case-Laufzeit, Informatiker notieren dies mittels Landau-Symbol durch O(n2.7). Der exakte Wert des Exponenten ist log(3)/log(1.5).

Pseudocode

Der folgende Pseudocode sortiert die Eingabemenge aufsteigend.

A: Liste (Array) mit der unsortierten Eingabemenge
 i: Linke Grenze des zu sortierenden Ausschnitts des Arrays
 j: Rechte Grenze des zu sortierenden Ausschnitts des Arrays
 
 stoogesort(A,i,j)
 1  if A[i] > A[j]
 2     then A[i] \leftrightarrow A[j]
 3  if i+1 \ge j
 4     then return
 5  k \leftarrow\lfloor(j-i+1)/3\rfloor
 6  stoogesort(A,i,j-k) \quad \triangleright Sortieren der ersten zwei Drittel
 7  stoogesort(A,i+k,j) \quad \triangleright Sortieren der letzten zwei Drittel
 8  stoogesort(A,i,j-k) \quad \triangleright Sortieren der ersten zwei Drittel
 

Implementierung

Eine Umsetzung des Algorithmus in Java:

 // Interface-Methode (um den Aufruf mit den richtigen Startwerten zu erzwingen)
 void stoogeSort(int[] a)
 {
   stoogeSort(a,0,a.length);
 }
 
 // Interne Methode
 void stoogeSort(int[] a,int s,int e)
 {
    if(a[e-1]<a[s])
    {
      int temp=a[s];
      a[s]=a[e-1];
      a[e-1]=temp;
    }
    int len=e-s;
    if(len>1)
    {
      int third=len/3;   // Zur Erinnerung: Dies ist die (abgerundete) Integer-Division
      stoogeSort(a,s,e-third);
      stoogeSort(a,s+third,e);
      stoogeSort(a,s,e-third);
    }
 }
 

Korrektheitsbeweis

Beweis durch Vollständige Induktion (Zeilennummer beziehen sich auf den oben angegebenen Pseudocode): Induktionsanfang

Für Länge des Arrays n=1 und n=2 sortiert Stoogesort korrekt, da in Zeile 1-4 des Algorithmus die Elemente der Liste in die richtige Reihenfolge gebracht werden und der Algorithmus an der Stelle abbricht.

Induktionsschluss

Aus der Induktionsvoraussetzung folgt, dass die Aufrufe in Zeilen 6-8 korrekt sortierte Teilarrays liefern. Elemente im i-ten Drittel einer korrekten Sortierung des Arrays heißen Typi-Elemente, i=1,2,3.

Nach der Sortierung der ersten zwei Drittel in Zeile 6 befindet sich kein Typ3-Element mehr im ersten Drittel der Liste.

Nach der Sortierung der letzten zwei Drittel in Zeile 7 stehen im letzten Drittel der Liste alle Typ3-Elemente in sortierter Reihenfolge.

Nach der erneuten Sortierung der ersten zwei Drittel in Zeile 8 stehen jetzt außerdem alle Typ1- und Typ2-Elemente in sortierter Reihenfolge.

Weblinks

Siehe auch: Liste von Algorithmen

See also: Stoogesort, Algorithmus, Divide and Conquer, Java (Programmiersprache), Liste von Algorithmen, Pseudocode, Rekursion, Sortieralgorithmus, Vollständige Induktion