next up previous contents
Next: Minimale Spannbäume Up: Selektieren und Sortieren Previous: Bucketsort im Schnitt

Quicksort

Wie bei vielen anderen Sortierverfahren (Bubblesort, Mergesort, usw.) ist auch bei Quicksort die Aufgabe, die Elemente eines Array a[1..n] zu sortieren. Quicksort ist zudem ein Divide-and-Conquer-Verfahren.

Devide: Wähle ein Pivot-Element p (z.B. das letzte) und partitioniere a[l..r] gemäß p in zwei Teile a[l..i-1] und a[i+1] (durch geeignetes Vertauschen der Elemente), wobei anschließend a[i]=p.

Conquer: Sortiere a[l..i-1] und a[i+1..r] rekursiv.

Algorithmus:


proc qs(a,l,r) { if $l\geq r$ then return fi $\char93 $ifdef Variante 2 vertausche a[random(l,r)] mit a[r] ; $\char93 $endif p:=a[r] ; i:=l; j:=r ; repeat while i<j and $a[i]\leq p$ do i++ od while i<j and $p\leq a[j]$ do j- od if i<j then vertausche a[i] und a[j]; until i==j; vertausche a[i] und a[r]; qs(a,l,i-1); qs(a,i+1,r); }

Bemerkung: Der oben formulierte Algorithmus benötigt pro Durchlauf in der Regel n+1 Schlüsselvergleiche. Lediglich wenn die beiden Indizes zusammenfallen (was nur bei einem Pivotduplikat passieren kann), benötigt er nur n Vergleiche. Durch geschicktes Einstreuen von if-Abfragen kann man auch in jedem Fall mit n-1 Schlüsselvergleichen auskommen.

Komplexität von Quicksort:


next up previous contents
Next: Minimale Spannbäume Up: Selektieren und Sortieren Previous: Bucketsort im Schnitt
Abbas-Bardia Kabiri-Jarghouyeh
3/3/1999