Quicksort: Unterschied zwischen den Versionen

Aus KGS-Wiki
(Die Seite wurde neu angelegt: „{{subst::Bubblesort}}“)
 
(Seite angelegt)
Zeile 1: Zeile 1:
[[Bubblesort]] ist ein [[Algorithmus|Sortieralgorithmus]] und arbeitet wie folgt:
[[Quicksort]] ist ein [[Algorithmus|Sortieralgorithmus]], der nach dem Prinzip ''[[Divide and Conquer]]'' arbeitet; und zwar wie folgt:


Gegeben: Liste <code>A</code> der Länge <code>n</code>.
Gegeben: Liste <code>A</code> der Länge <code>n</code>.


* Falls <code>n < 2</code>: <code>A</code> ist sortiert, brich ab. Ansonsten…
* Falls <code>n < 2</code>: <code>A</code> ist sortiert, brich ab. Ansonsten…
* Wiederhole <code>n-1</code> Mal:
* Wähle ein Element aus der Liste, das so genannte ''Pivot-Element''
** Gehe von <code>A[0]</code> bis <code>A[n-2]</code> durch
* Teile die Liste in zwei Haufen. Auf einen Haufen kommen die Elemente, die kleiner sind als das Pivot-Element, auf den anderen Haufen die Elemente, die größer sind.
** Betrachte jeweils ein Element und seinen rechten Nachbarn (also <code>A[i]</code> und <code>A[i+1]</code>)
* Sortiere beide Haufen mit Quicksort; du erhältst zwei sortierte Listen
** Wenn <code>A[i] > A[i+1]</code>, vertausche die beiden
* Füge die beiden sortierten Teillisten mit dem Pivot-Element zu einer sortierten Gesamtliste zusammen.
* Danach ist die Liste sortiert, gib die sortierte Liste als Ergebnis zurück


== Laufzeit ==
== Laufzeit ==
Eine Liste mit <code>n</code> Elementen muss <code>n-1</code> Mal durchgegangen werden und bei jedem Durchgang werden <code>n-1</code> Vergleiche angestellt. Insgesamt sind das <code>(n-1)²</code> Vergleiche. Damit bewegt sich die Laufzeit in <math>\mathcal{O}(n^2)</math>.
Um die Liste in zwei Haufen zu unterteilen, muss man alle <code>n</code> Elemente betrachten, ist also in <math>\mathcal{O}(n)</math>. Das Zusammenfügen am Ende hat eine Laufzeit, die nicht von der Länge der Eingabeliste abhängt, ist also in <math>\mathcal{O}(1)</math>. Die Frage ist nun, wie oft die Liste unterteilt werden muss.
{{Navigationsleiste Sortieralgorithmen}}
 
=== Worst Case ===
Im schlechtesten Fall wählt man das Pivot-Element so ungeschickt, dass der gesamte Rest der Liste immer auf einem Haufen landet. Dies ist der Fall, wenn man als Pivot-Element das größte oder das kleinste Element der Liste wählt. In diesem Fall muss die Liste <code>n-1</code> Mal in Haufen unterteilt werden, es ergibt sich eine Laufzeit in <math>\mathcal{O}(n^2)</math>.
 
=== Best Case ===
Im besten Fall wählt man das Pivot-Element so geschickt, dass man die Liste immer in zwei exakt gleich große Haufen teilt. Dann muss die Liste etwa <math>\log n</math> Mal in Haufen unterteilt werden; es ergibt sich eine Laufzeit in <math>\mathcal{O}(n\log n)</math>.{{Navigationsleiste Sortieralgorithmen}}

Version vom 16. Januar 2024, 17:52 Uhr

Quicksort ist ein Sortieralgorithmus, der nach dem Prinzip Divide and Conquer arbeitet; und zwar wie folgt:

Gegeben: Liste A der Länge n.

  • Falls n < 2: A ist sortiert, brich ab. Ansonsten…
  • Wähle ein Element aus der Liste, das so genannte Pivot-Element
  • Teile die Liste in zwei Haufen. Auf einen Haufen kommen die Elemente, die kleiner sind als das Pivot-Element, auf den anderen Haufen die Elemente, die größer sind.
  • Sortiere beide Haufen mit Quicksort; du erhältst zwei sortierte Listen
  • Füge die beiden sortierten Teillisten mit dem Pivot-Element zu einer sortierten Gesamtliste zusammen.

Laufzeit

Um die Liste in zwei Haufen zu unterteilen, muss man alle n Elemente betrachten, ist also in . Das Zusammenfügen am Ende hat eine Laufzeit, die nicht von der Länge der Eingabeliste abhängt, ist also in . Die Frage ist nun, wie oft die Liste unterteilt werden muss.

Worst Case

Im schlechtesten Fall wählt man das Pivot-Element so ungeschickt, dass der gesamte Rest der Liste immer auf einem Haufen landet. Dies ist der Fall, wenn man als Pivot-Element das größte oder das kleinste Element der Liste wählt. In diesem Fall muss die Liste n-1 Mal in Haufen unterteilt werden, es ergibt sich eine Laufzeit in .

Best Case

Im besten Fall wählt man das Pivot-Element so geschickt, dass man die Liste immer in zwei exakt gleich große Haufen teilt. Dann muss die Liste etwa Mal in Haufen unterteilt werden; es ergibt sich eine Laufzeit in .

Weblinks