Schnelle Sortierung in c

Schnelle Sortierung in c

„Quicksort oder Quick-Sort ist ein Sortieralgorithmus. Quick Sort. Lassen Sie die Liste der Zeichen sortiert werden nach:

Q w e r t y u i o p

Die sortierte Liste lautet:

E i o p q r t u w y

Dies ist eine Art aufsteigend. In diesem Artikel sortiert die Erklärung für Quicksort, die aufsteigend die Liste steigt: "Q", "W", "E", "R", "T", "Y", "U", "I", ",", " O ”,„ P “und die C -Sprache.”

Schnelle Art in der Theorie

Aus der Liste "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", schnelle Sorte wird aussehen für einen zentralen Wert, der als Pivot bezeichnet wird. In der sortierten Liste,

"E", "i", "o", "p", "q", "r", "t", "u", "w", "y"

Der Drehpunkt ist entweder "q" oder "r", da die Liste sogar in der Anzahl ist. Wenn die Liste ungerade wäre, wäre der Drehpunkt eindeutig der mittlere Wert gewesen. "Q" bei Index 4 wird als Pivot ausgewählt. Denken Sie daran, dass die zu sortierende Liste ist,

Q w e r t y u i o p

und nicht die sortierte Liste. In dieser unsortierten Liste gibt es 10 Elemente.

Die erste Stufe besteht darin. Die zweite Stufe besteht darin, den Drehpunkt in seine rechtmäßige Position in der unortheiligen Liste (in diesem Fall Index 4) zu platzieren; und setzen Sie alle Elemente, die weniger als der Drehpunkt links sind, und alle Elemente, die größer sind als der Drehpunkt rechts. Die Elemente links vom Drehpunkt dürfen nicht unbedingt sortiert werden, und die Elemente rechts vom Drehpunkt dürfen nicht unbedingt auch sortiert werden. Diese Phase ist die Kluft- oder Partitionsphase in der Kluft und erobert den Algorithmus. Für diese Phase gibt es drei Teile: die linke Unterliste, die rechte Unterliste und die mittlere Unterliste. Die mittlere Unterliste besteht aus nur einem Element, das der Drehpunkt ist. Für die oben genannte Liste wäre das Ergebnis:

E i o p q w r t y u

Da sich der Drehpunkt bereits in seiner endgültigen Position befindet, besteht die letzte Phase theoretisch darin, die linke Unterliste zu sortieren und die rechte Unterliste zu sortieren. Das erobert. Es ist ein Zufall, dass die linke Unterliste in diesem Fall bereits sortiert ist. In diesem Fall muss die richtige Unterliste noch sortiert werden. Sortieren Sie die linke und rechte Unterliste separat, das Ergebnis ist:

E i o p q r t u w y

nach Bedarf.

Schnelle Sortierung in der Praxis

In der Praxis erfolgt die Aufteilung mit einiger Sortierungen (Tausch) wiederholt rekursiv. Das heißt. Mit anderen Worten, aus der Hauptliste werden dreiteiliger und kleinerer Unterlisten entwickelt, bis die gesamte Liste sortiert ist.

Es gibt ein Problem, wenn es darum geht, den Drehpunkt auszuwählen. Die gesamte unsortierte Liste kann nicht über Element für Element gescannt werden, um den richtigen Drehpunkt zu erhalten. Das wird zeitaufwändig sein. Es muss also eine intelligente Vermutung gemacht werden.

Denken Sie daran, dass die zu sortierende Liste lautet:

Q w e r t y u i o p

Lassen Sie die intelligente Vermutung P, das rechtste Element sein. Als nächstes lassen Sie alle Elemente weniger als p, lesen Sie von links, gehen Sie links von P und lassen. Das gibt:

E i o p q w r t y u

Die ersten drei Unterlisten sind:

"E", "i", "o", "p", "q", "w", "r", "t", "y", "u"

P befindet sich in seiner rechtmäßigen Position (in der Praxis ist es möglicherweise nicht unbedingt Index 4; hier ist es in dieser Phase Index 3). Der nächste Schritt ist ein rekursiger Aufruf, die linke Unterliste in drei Unterlisten zu unterteilen. und die richtige Unterliste in drei Unterlisten, jeweils mit einem eigenen Drehpunkt, von einer intelligenten Vermutung.

Teilen "e", "i", "o"
Lassen Sie seine intelligente Pivot-Vermutung, o, das rechtste Element sein. Alle Elemente, die weniger als O sind, müssen nach links gehen, und alle Elemente, die größer als O sind. Das gibt:

"E", "i", "o",

ohne Element rechts. Wenn "e", "i" auch rekursiv aufgeteilt ist, wird ["E", "I", ] entstanden. Und so ist die erste linke Unterliste sortiert:

"E", "i", "o"

Teilen "q", "w", "r", "t", "y", "u"
"Q", "w", "r", "t", "y", "u" ist die erste rechte Unterliste. Lassen Sie seine intelligente Pivot-Vermutung u, das rechtste Element. Alle Elemente, die weniger als Sie sind, müssen nach links gehen, und alle Elemente, die größer sind als Sie, müssen nach rechts gehen; Lesen Sie für beide Fälle von links. Das gibt:

"Q", "r", "t", "u", "w", "t"

Durch rekursives Partitionieren von "q", "r", "t" und "w", "t" auf die gleiche Weise wäre die erste rechte Unterliste:

"Q", "r", "t", "u", "w", "y"

Und die komplette sortierte Liste wäre:

E i o p q r t u w y

Beachten Sie, dass jede Partition in einem breiten Sinne sortiert wird, indem Sie unsortierte niedrigere Werte links und nicht mehr höhere Werte rechts platzieren.

Beachten Sie auch, dass die intelligente Vermutung nur das richtige Element einer Unterliste auswählte. Das ist nicht die beste intelligente Vermutung. Andererseits besteht die Lösung (für intelligente Vermutung) nicht darin, die gesamte angegebene Liste zu scannen! - Weitere Optionen finden Sie unten.

Schneller Sortiercode in C

Obwohl für jede Unterliste oben der rechtste Wert ausgewählt wurde. Selbst wenn eine intelligentere Vermutung vorgenommen wird, muss der gut erratene Wert in die links am meisten platzierte Position platziert werden. und der linke Wert, der dort dort wurde, wird in einer anderen geeigneten Position platziert (noch in der Liste).

Es gibt vier C -Funktionen mit den Namen, Swap (), Pivot (), Partition () und QuickSort (). Quicksort (), die Funktion, wird auf rekursive Weise codiert und ruft die anderen Funktionen auf.

Die SWAP () -Funktion
Diese Funktion tauscht zwei Array -Elemente mit ihren Indizes aus. Es ist:

Hohlraumtausch (char a [], int m, int n)
char temp = a [m];
A [m] = a [n];
A [n] = temp;

Eine einfache Pivot () -Funktion
Diese Funktion wählt zwischen dem linken Element und dem rechtsten Element der angegebenen gesamten Liste aus. Es bringt den weniger beider bei der links und die größere in der rechtssten Position. Es ist:

void pivot (char a [], int links, int rechts)
if (a [links]> a [rechts])
tauschen (a, links, rechts);

Dies ist besser, als nur das richtige Element für die Liste und die Unterlisten auszuwählen, wie oben. Eine noch bessere Pivot () -Funktion ist unten angegeben.

Eine Partition () -Funktion
So wie die Funktion pivot () auf unterschiedliche Weise geschrieben werden kann, kann die Funktion partition () auf unterschiedliche Weise geschrieben werden. Der für diesen Artikel ausgewählte ist:

int partition (char a [], int links, int rechts)
int pivot = a [links];
int i = links;
int j = rechts + 1;
Tun
do ++ i;
während (a [i] pivot);
wenn ich < j)
tauschen (a, ich, j);
während ich < j);
tauschen (a, j, links);
Rückkehr J;

Nach dem Platzieren des Pivot-Elements in der linken Position der Liste oder der Unterliste durch die Funktion pivot () scannt die Partitionsfunktion die Liste oder die Unterliste von beiden Enden und tausch des Drehscheibe. Das Scannen vom linken Ende beginnt nach dem Drehpunkt des linken Ende (entweder der Liste oder der Unterliste); Weil der Drehpunkt zuletzt ausgetauscht wird („do ++ i;“ oben).

Der Rückgabeindex, J, ist die neue (nächste) Pivot -Position.

Die Funktion von QuickSort ()
Dies ist eine rekursive Funktion, die die anderen Funktionen aufruft. Es ist:

void Quicksort (char a [], int links, int rechts)
if (links < right)
Pivot (a, links, rechts);
int k = partition (a, links, rechts);
Quicksort (a, links, K-1);
QuickSort (a, k+1, rechts);

Hier ist K dieselbe wie j, die oben zurückgegeben wurden.

Alle oben beschriebenen Funktionen bilden zusammen das QuickSort -Programm.

Die C -Hauptfunktion

Eine geeignete C -Hauptfunktion zum Testen des Programms ist:

int main (int argc, char ** argv)

char a [] = "q", "w", "e", "r", "t", "y", "u", "i", "o", "p";
int sz = sizeof (a)/sizeof (a [0]);
QuickSort (a, 0, SZ-1);
für (int i = 0; iprintf ("%c", a [i]);
printf ("\ n");
Rückkehr 0;

Die richtige Funktion von QuickSort () wird aus der Hauptfunktion C aufgerufen und das Array als erstes Argument übergeben. Das zweite Argument ist ein Index, 0 der gesamten Liste. Das dritte Argument ist der letzte, aber ein Index der gesamten Liste.

Median Drehzahl

Wenn drei verschiedene Zahlen in aufsteigender Reihenfolge angeordnet sind, ist der Median der mittlere (zweite) Wert. Ein besserer Weg als der Vorher. Der Code ist:

int midindex = (links + rechts) / 2; // Ganze Nummer genommen
if (a [Midindex] < A[left])
Swap (a, links, Midindex);
if (ein [rechts] < A[left])
tauschen (a, links, rechts);
if (a [Midindex] < A[right])
Swap (a, Midindex, rechts);
char pivot = a [rechts];

Beachten Sie, dass die drei Elemente möglicherweise die Positionen geändert haben könnten. Dieser Code wird mit der oben genannten Pivot () -Funktion kombiniert::

void pivot (char a [], int links, int rechts)
// den Median erhalten
int midindex = (links + rechts) / 2; // Ganze Nummer genommen
if (a [Midindex] < A[left])
Swap (a, links, Midindex);
if (ein [rechts] < A[left])
tauschen (a, links, rechts);
if (a [Midindex] Drehzahl)
tauschen (a, links, rechts); // Ansonsten ist ein [links] der Drehpunkt

Beachten Sie die letzte If-Kondition.

Abschluss

Quick-Sort ist eine Kluft und erobert den Sortieralgorithmus. Es teil. Die mittlere Unterliste besteht immer aus einem Element, das der Drehpunkt ist. Bei der Herstellung des Drehes erfolgt die Sortierung in dieser Phase in einem breiten Sinne. Im Laufe der Rekursion wird jedoch eine perfekte Sortierung am Ende des Programms erhalten.