„Das Ziel dieses Artikels ist es, die Ähnlichkeiten und Unterschiede zwischen schneller Sorte und Zusammenführungsart zu verleihen. Der Artikel "Quick Sort in C" oder einen ähnlichen Titel wurde bereits für LinuxHint geschrieben.com/. Der Titel kann im Suchfeld der LinuxHint eingegeben werden.Com -Homepage, um den Artikel zu erreichen. Ein weiterer Artikel, "Merge -Sort in C" oder einen ähnlichen Titel, wurde bereits für LinuxHint geschrieben.com/. Der Titel kann im Suchfeld der LinuxHint eingegeben werden.Com -Homepage, um den Artikel zu erreichen. Dem Leser wird empfohlen, sich auf diese beiden Artikel zu beziehen, während er diesen liest.
Schnelle Sortierung ist ein Sortieralgorithmus. Zusammenführende Sortierung ist ein anderer Sortieralgorithmus. Der Code für die beiden oben genannten Artikel ist in c geschrieben. Der Code für diesen Artikel ist auch in C geschrieben. Der Leser sollte sich dessen bewusst sein. Sortiersteigerung wird für beide Sortieralgorithmen in diesem Artikel berücksichtigt.”
Artikelinhalt
Algorithmen für schnelle Sortier- und Zusammenführungssorten
Algorithmus für Quicksort
1) Wenn in der Liste nur ein oder gar kein Element vorhanden ist, geben Sie dann zurück. Ein Element bedeutet, dass die Liste bereits sortiert ist. Zero Element bedeutet, dass es nichts zu sortieren gibt.
2) Wählen Sie mit einer intelligenten Vermutung ein geeignetes Element in der Liste als Pivot aus.
3) Partition (teilen) die Liste in drei Unterlisten. Machen Sie alle Elemente für die linke Unterliste weniger als der Drehpunkt. Die zentrale Liste hat nur ein Element, nämlich der Drehpunkt. Machen Sie alle Elemente auf der rechten Unterliste größer als der Drehpunkt. Indem sie links Elemente einstellen, die weniger als der Drehpunkt und Elemente rechts sind, die größer sind als der Drehpunkt, ohne reine Sortierung, ist dies bereits eine Sortierung (im breiten Sinne).
4) Teilen Sie jede Unterliste (links und rechts) rekursiv in drei, wie im obigen Schritt, wobei jeder Satz von drei Sublisten einen eigenen neuen Drehpunkt (einer Sub-Liste eines Elements) aufweist, bis die gesamte angegebene Liste ist perfekt sortiert.
Für Schritt 2 gibt es verschiedene Codierungsformulare. Ein besseres Codierungsformular führt zu einer schnelleren kompletten Sortierung.
Für Schritt 3 gibt es verschiedene Codierungsformulare. Ein besseres Codierungsformular führt zu einer schnelleren kompletten Sortierung.
Algorithmus für Mergesort
1) Wenn in der Liste nur ein oder gar kein Element vorhanden ist, geben Sie dann zurück. Ein Element bedeutet, dass die Liste bereits sortiert ist. Zero Element bedeutet, dass es nichts zu sortieren gibt.
2) Teilen Sie die Liste und ihre Unterläufer rekursiv in zwei Hälften, bis jede Unterliste nur ein Element hat.
3) Sortieren Sie Paare von Unterlisten von links nach rechts rekursiv, einschließlich resultierender größerer Paare, bis die gesamte Liste wiedererlangt, aber vollständig sortiert ist.
Dies ist der normale Weg, um Mergesort zu machen, und es gibt nicht wirklich Platz für verschiedene Codesegmente, für den gleichen Zweck wie Quicksort.
Big-O-Notation von O (n), O (n2) und o (n).log (n))
An)
Betrachten Sie den folgenden Code:
int n = 8;
int sum = 0;
int a [] = 1, 2, 3, 4, 5, 6, 7, 8;
für (int i = 0; isum = sum + a [i];
printf ("%d \ n", sum);
n = 8. Die Ausgabe ist die Summe 36. In der für die Schleife gibt es eine Operation, die 8 Mal ausgeführt wird. In der Big-O-Notation ist diese Geschwindigkeit (Zeitkomplexität) als geschrieben als,
An)
Betrachten Sie den folgenden ähnlichen Code, in dem nur die ungeraden Zahlen hinzugefügt werden:
int n = 8;
int sum = 0;
int a [] = 1, 2, 3, 4, 5, 6, 7, 8;
für (int i = 0; isum = sum + a [i];
printf ("%d \ n", sum);
Die Ausgabe, die diesmal ist, beträgt 16. In der für die Schleife wird die einzige Operation 4-mal ausgeführt, was N/2-mal ist. In der Big-O-Notation ist diese Geschwindigkeit (Zeitkomplexität) immer noch als O (n) geschrieben. Die maximale Anzahl möglicher Operationen wird berücksichtigt.
An2)
Betrachten Sie den folgenden Code, der die Matrix von 8 x 8 Zahlen hinzufügt:
int n = 8;
int sum = 0;
int a [] = 1, 2, 3, 4, 5, 6, 7, 8;
für (int i = 0; ifür (int j = 0; j sum = sum + a [j];
printf ("%d \ n", sum);
Die Ausgabe, die Summe, beträgt 288. In der FOR-Schleife gibt es eine Operation, die 8 x 8 Mal = 64 Mal ausgeführt wird. In der Big-O-Notation ist diese Geschwindigkeit (Zeitkomplexität) als geschrieben als,
O (n²)
Betrachten Sie den folgenden ähnlichen Code, wobei nur die ungeraden Nummern der Matrix hinzugefügt werden:
int n = 8;
int sum = 0;
int a [] = 1, 2, 3, 4, 5, 6, 7, 8;
für (int i = 0; ifür (int j = 0; j sum = sum + a [j];
printf ("%d \ n", sum);
Die Ausgabe, die diesmal, beträgt 64. In der FOR-Schleife wird die einzige Operation 4 x 4-mal = 16 Mal ausgeführt, was n ist2/4 Mal. Dies ist mehr als 8 Mal (mehr als n -mal), aber weniger als 64 Mal (weniger als n2 mal). In der Big-O-Notation kann diese Geschwindigkeit (Zeitkomplexität) immer noch als O (n) geschrieben werden2). Die maximale Anzahl möglicher Operationen wird berücksichtigt.
Verwechseln Sie hier nicht die Summe 64 und die Anzahl der Operationen, 16. Dieser Fall von 16 Operationen zwischen 8 (n) und 64 (n)2), kann weiterhin wie in den folgenden Unterabschnitt geschrieben werden.
An.log (n))
Betrachten Sie die Situation einer 8-mal-8-Matrix, in der die Gesamtzahl der Operationen 24 beträgt. 24 kann als ungefähr in der Mitte, zwischen 8 (n) und 64 (n) angesehen werden2).
Jetzt,
24 = 8xlog2(8)
=> 24 = 8xlog2(23)
=> 24 = 8 × 3
Jetzt vergleichen,
24 = 8xlog2(8)
mit
24 = n.Protokoll2(N)
Für das Maximum von n2, Wenn die Gesamtzahl der Operationen zwischen N und N liegt2, Und in ihrer Mitte, in der Big-O-Notation ist diese Geschwindigkeit (Zeitkomplexität) besser als n geschrieben.Protokoll2(n) anstelle von o (n2).
Vergleich der schnellen Sortier- und Zusammenführungssorte
Anzahl der Schritte im Algorithmus
Von oben hat Quicksort 4 Schritte in seinem Algorithmus, während Mergesort 3 Schritte in seinem Algorithmus hat.
Verschiedene Codierungsweisen
Schnelle Sortierung hat unterschiedliche Codierungsweisen, während die Zusammenführungssortierung nur eine Hauptmethode zum Codieren hat.
Zeitkomplexität
Die zeitliche Komplexität für Mergesort ist n.Protokoll2(N). Seine Geschwindigkeit ist vergleichbar mit der Sortierfunktion der C ++ - Bibliothek, die für kommerzielle Zwecke verwendet wird.
Wenn die mediane Pivot -Funktion für QuickSort verwendet wird, beträgt die Zeitkomplexität ungefähr 1.188n.Protokoll2(n), höher als Mergesort, vorausgesetzt, eine gute Partitionsfunktion wird verwendet. Viele Quicksort -Programme haben eine höhere Zeitkomplexität. Die schlimmste Zeitkomplexität für Quicksort ist o (n2). Wenn das QuickSort -Programm jedoch mit sehr guten Codesegmenten gut codiert ist, würde es Mergesort in Geschwindigkeitsort besiegen.
Abschluss
Quicksort läuft normalerweise langsamer als Mergesort.