Das ist etwas schwer zu lesen Pseudo-Code. Dies könnte ein bisschen leichter zu verstehen sein:
QuickSort(b[], low, hi)
while the range low..hi contains more than 1 element
1: Pick a random pivot 'j' from the array
2: Re-order the array so that all elements less than the pivot are in
b[low..j-1], and all elements greater than the pivot are in b[j+1..hi]
3: Call quicksort on the side with less elements, and update the range to
exclude the sorted side
Etwa die Hälfte der Werte geringer sein wird als die Dreh, und die Hälfte der Werte größer als die Dreh sein. Dies bedeutet, dass nach Schritt 3 die Größe des Bereichs niedrig .. hi grob halbiert wurde. Also braucht es log | N | Iterationen vor dem Bereich enthält nur ein Element.
Es ist schwer, dieses Bit zu erklären, aber sehen Sie, wie Schritt 3 QuickSort nur auf einer Hälfte des Arrays aufruft? Das liegt daran, dass der Rest der While-Schleife die andere Hälfte sortiert. Die Funktion leicht wieder geschrieben werden könnte wie folgt zusammen:
QuickSort(b[], low, hi)
if the range low..hi contains more than 1 element
1: Pick a random pivot 'j' from the array
2: Re-order the array so that all elements less than the pivot are in
b[low..j-1], and all elements greater than the pivot are in b[j+1..hi]
3: Call quicksort on both sides
Die while-Schleife durch eine ersetzt wurde if-Anweisung und einen zweiten rekursiven Aufruf. Ich hoffe von hier aus, dass Sie die Komplexität in etwa N log | N | sehen können.
bearbeiten
Wie funktioniert die while-Schleife Art die übrigen Elemente? Nach Schritt 3 wurde der Bereich aktualisiert, um die kleinere Hälfte auszuschließen, da wir sie einfach mit einem Aufruf von QuickSort sortiert haben. Dies bedeutet, dass der Bereich nur die größere Hälfte enthält - die unsortierten Elemente. Daher wiederholen wir die Schritte 1 - 3 für diese unsortierten Elemente und aktualisieren den Bereich erneut.
Die Anzahl der unsortierten Elemente wird mit jeder Iteration kleiner und kleiner und schließlich bleibt nur ein unsortiertes Element übrig. Aber natürlich ist ein Element sortiert, so dass wir an dieser Stelle wissen, wir haben jedes Element im Array sortiert.
können Sie mit mehr Dokumentation – rocketspacer
bieten Ich habe noch nie so codiert auf diese Weise gesehen. Anstatt sich selbst zweimal aufzurufen (wie ich zuvor gesehen habe), verwendet dieser Code die while-Schleife anstelle der zweiten Rekursion. –