GeeksforGeeks (Deutsch)

Wie Merge Sort ist QuickSort ein Divide and Conquer-Algorithmus. Es wählt ein Element als Drehpunkt aus und partitioniert das angegebene Array um den ausgewählten Drehpunkt. Es gibt viele verschiedene Versionen von quickSort, die Pivot auf unterschiedliche Weise auswählen.

  1. Immer das erste Element als Drehpunkt auswählen.
  2. Immer das letzte Element als Drehpunkt auswählen (unten implementiert)
  3. Ein zufälliges Element als Drehpunkt auswählen.
  4. Wählen Sie den Median als Pivot aus.

Der Schlüsselprozess in quickSort ist partition (). Das Ziel von Partitionen besteht darin, bei einem Array und einem Element x des Arrays als Drehpunkt x an der richtigen Position im sortierten Array zu platzieren und alle kleineren Elemente (kleiner als x) vor x und alle größeren Elemente (größer als x) danach zu setzen x. All dies sollte in linearer Zeit erfolgen.

Pseudocode für die rekursive QuickSort-Funktion:

Partitionsalgorithmus
Es gibt viele Möglichkeiten, eine Partition durchzuführen, wenn der Pseudocode die im CLRS-Buch angegebene Methode übernimmt. Die Logik ist einfach: Wir beginnen mit dem Element ganz links und verfolgen den Index kleinerer (oder gleicher) Elemente wie i. Wenn wir beim Durchlaufen ein kleineres Element finden, tauschen wir das aktuelle Element gegen arr aus. Andernfalls ignorieren wir das aktuelle Element.

Pseudocode für partition ()

Abbildung von partition ():

Implementierung:
Im Folgenden sind die Implementierungen von QuickSort aufgeführt:

Ausgabe:

Sorted array:1 5 7 8 9 10

Analyse von QuickSort
Die von QuickSort im Allgemeinen benötigte Zeit kann wie folgt geschrieben werden.

 T(n) = T(k) + T(n-k-1) + (n)

Die ersten beiden Begriffe beziehen sich auf zwei rekursive Aufrufe, der letzte auf den Partitionsprozess. k ist die Anzahl der Elemente, die kleiner als Pivot sind.
Die von QuickSort benötigte Zeit hängt vom Eingabearray und der Partitionsstrategie ab. Es folgen drei Fälle.

Schlimmster Fall: Der schlimmste Fall tritt auf, wenn der Partitionsprozess immer das größte oder kleinste Element als Drehpunkt auswählt. Wenn wir die obige Partitionsstrategie betrachten, bei der das letzte Element immer als Drehpunkt ausgewählt wird, tritt der schlimmste Fall auf, wenn das Array bereits in aufsteigender oder absteigender Reihenfolge sortiert ist. Es folgt eine Wiederholung im schlimmsten Fall.

 T(n) = T(0) + T(n-1) + (n)which is equivalent to T(n) = T(n-1) + (n)

Die Lösung der obigen Wiederholung ist (n2).

Bester Fall: Der beste Fall tritt auf, wenn der Partitionsprozess immer den auswählt mittleres Element als Drehpunkt. Das Folgende ist eine Wiederholung für den besten Fall.

 T(n) = 2T(n/2) + (n)

Die Lösung der obigen Wiederholung ist (nLogn). Es kann mit Fall 2 des Master-Theorems gelöst werden.

Durchschnittlicher Fall:
Um eine durchschnittliche Fallanalyse durchzuführen, müssen wir alle möglichen Permutationen des Arrays berücksichtigen und die Zeit berechnen, die von jeder Permutation benötigt wird, die dies nicht tut Schauen Sie einfach aus.
Wir können uns ein Bild von einem durchschnittlichen Fall machen, indem wir den Fall betrachten, in dem die Partition O (n / 9) -Elemente in einen Satz und O (9n / 10) -Elemente in einen anderen Satz einfügt. Es folgt eine Wiederholung für diesen Fall.

 T(n) = T(n/9) + T(9n/10) + (n)

Die Lösung der obigen Wiederholung ist auch O (nLogn)

Obwohl die Zeitkomplexität von QuickSort im ungünstigsten Fall O (n2) ist QuickSort ist mehr als viele andere Sortieralgorithmen wie Merge Sort und Heap Sort. In der Praxis ist QuickSort schneller, da seine innere Schleife auf den meisten Architekturen und in den meisten realen Daten effizient implementiert werden kann. QuickSort kann auf verschiedene Arten implementiert werden, indem die Auswahl des Pivots geändert wird, sodass der schlimmste Fall für einen bestimmten Datentyp selten auftritt. Die Zusammenführungssortierung wird jedoch im Allgemeinen als besser angesehen, wenn die Daten sehr groß sind und in einem externen Speicher gespeichert werden.

Ist QuickSort stabil?
Die Standardimplementierung ist nicht stabil. Jeder Sortieralgorithmus kann jedoch stabilisiert werden, indem Indizes als Vergleichsparameter betrachtet werden.
Ist QuickSort vorhanden?
Gemäß der allgemeinen Definition des In-Place-Algorithmus qualifiziert er sich als In-Place-Sortieralgorithmus, da er zusätzliche verwendet Platz nur zum Speichern rekursiver Funktionsaufrufe, nicht aber zum Bearbeiten der Eingabe.

Wie implementiere ich QuickSort für verknüpfte Listen?
QuickSort für einfach verknüpfte Listen
QuickSort auf doppelt verknüpfter Liste

Können wir QuickSort iterativ implementieren?
Ja, beziehen Sie sich bitte auf iterative schnelle Sortierung.

Warum wird die schnelle Sortierung zum Sortieren von Arrays egenüber MergeSort bevorzugt
Die schnelle Sortierung in ihrer allgemeinen Form ist eine direkte Sortierung (dh sie erfordert keinen zusätzlichen Speicher), während die Zusammenführungssortierung O (N) zusätzlichen Speicher erfordert, wobei N die Arraygröße angibt, die recht teuer sein kann. Das Zuweisen und Aufheben der Zuweisung des zusätzlichen Speicherplatzes für die Zusammenführungssortierung erhöht die Laufzeit des Algorithmus. Beim Vergleich der durchschnittlichen Komplexität stellen wir fest, dass beide Arten von Sorten eine durchschnittliche Komplexität von O (NlogN) aufweisen, die Konstanten sich jedoch unterscheiden. Bei Arrays verliert die Sortierung beim Zusammenführen aufgrund der Verwendung von zusätzlichem O (N) -Speicherplatz.

Die meisten praktischen Implementierungen der Schnellsortierung verwenden eine zufällige Version. Die randomisierte Version hat eine zeitliche Komplexität von O (nLogn) erwartet.Der schlechteste Fall ist auch in einer zufälligen Version möglich, aber der schlimmste Fall tritt nicht für ein bestimmtes Muster (wie ein sortiertes Array) auf, und die zufällige schnelle Sortierung funktioniert in der Praxis gut.

Die schnelle Sortierung ist auch eine cachefreundliche Sortierung Algorithmus, da er bei Verwendung für Arrays eine gute Referenzlokalität aufweist.

Die Schnellsortierung ist ebenfalls endrekursiv, daher werden Endaufrufoptimierungen durchgeführt.

Warum MergeSort für verknüpfte Listen gegenüber QuickSort bevorzugt wird
Bei verknüpften Listen ist der Fall hauptsächlich aufgrund der unterschiedlichen Speicherzuordnung von Arrays und verknüpften Listen anders. Im Gegensatz zu Arrays sind verknüpfte Listenknoten möglicherweise nicht im Speicher benachbart. Im Gegensatz zum Array können wir in der verknüpften Liste Elemente in der Mitte in O (1) zusätzlichem Speicherplatz und O (1) Zeit einfügen. Daher kann die Zusammenführungsoperation der Zusammenführungssortierung ohne zusätzlichen Platz für verknüpfte Listen implementiert werden.

In Arrays können wir wahlfrei zugreifen, da die Elemente im Speicher kontinuierlich sind. Nehmen wir an, wir haben ein ganzzahliges (4-Byte) Array A und lassen die Adresse von A x sein. Um auf A zuzugreifen, können wir direkt auf den Speicher unter (x + i * 4) zugreifen. Im Gegensatz zu Arrays können wir in der verknüpften Liste keinen Direktzugriff durchführen. Schnelle Sortierung erfordert viel von dieser Art von Zugriff. In der verknüpften Liste müssen wir für den Zugriff auf den i-ten Index jeden einzelnen Knoten vom Kopf zum i-ten Knoten bewegen, da wir keinen kontinuierlichen Speicherblock haben. Daher erhöht sich der Overhead für eine schnelle Sortierung. Die Zusammenführungssortierung greift nacheinander auf Daten zu, und der Bedarf an wahlfreiem Zugriff ist gering.

So optimieren Sie QuickSort so, dass im schlimmsten Fall O (Log n) zusätzlichen Speicherplatz benötigt wird.
Weitere Informationen finden Sie unter QuickSort-Tail-Call-Optimierung (Reduzierung des Worst-Case-Speicherplatzes auf Log n)

Schnappschüsse:

  • Quiz zu QuickSort
  • Aktuelle Artikel zu QuickSort
  • Codierungspraxis für Sortieren.

Andere Sortieralgorithmen für GeeksforGeeks / GeeksQuiz:
Auswahlsortierung, Blasensortierung, Einfügesortierung, Zusammenführungssortierung, Heap-Sortierung, QuickSort , Radix-Sortierung, Zählsortierung, Bucket-Sortierung, ShellSort, Kammsortierung, Pigeonhole-Sortierung

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.