Quicksort wird häufig verwendet, weil seine Sortiereffizienz unter mehreren Sortierverfahren, die alle O(N*logN) sind, relativ hoch ist. Darüber hinaus ist die Idee des Quicksorts – die Divide-and-Conquer-Methode – tatsächlich praktisch. Daher testen viele Softwareunternehmen dies gern in schriftlichen Tests und Vorstellungsgesprächen, einschließlich bekannter IT-Unternehmen wie Tencent und Microsoft. Außerdem erscheint Quicksort häufig in programmierbezogenen Prüfungen verschiedener Größenordnungen, wie der Software-Qualifikationsprüfung und der Aufnahmeprüfung für das postgraduale Studium.
=a
Quicksort ist ein von C.R.A.Hoare im Jahr 1962 vorgeschlagenes Partition-Exchange-Sortierverfahren. Es verwendet eine Divide-and-Conquer-Strategie, die gewöhnlich Divide-and-Conquer-Methode genannt wird (Divide-and-Conquer Method).
Die Grundidee dieser Methode ist:
- 1. Zuerst nimmt man eine Zahl aus der Folge als Pivot.
- 2. Im Partitionierungsprozess werden alle Zahlen, die größer als diese Zahl sind, rechts von ihr platziert, und alle Zahlen, die kleiner oder gleich ihr sind, links von ihr.
- 3. Wiederholen Sie Schritt 2 für die linken und rechten Intervalle, bis jedes Intervall nur noch eine Zahl enthält.
- 1. i = L; j = R; hole das Pivot heraus, um das erste Loch a[i] zu bilden.
- 2. j--, suche von hinten nach vorne nach einer Zahl, die kleiner als das Pivot ist. Wenn du sie gefunden hast, nimm diese Zahl heraus und fülle sie in das vorherige Loch a[i] ein.
- 3. i++, suche von vorne nach hinten nach einer Zahl, die größer als das Pivot ist. Wenn du sie gefunden hast, nimm auch diese Zahl heraus und fülle sie in das vorherige Loch a[j] ein.
- 4. Wiederhole die Schritte 2 und 3, bis i==j gilt, und fülle dann das Pivot in a[i] ein.
Obwohl Quicksort als Divide-and-Conquer-Methode bezeichnet wird, können diese drei Wörter offensichtlich nicht alle Schritte des Quicksorts vollständig zusammenfassen. Daher habe ich eine weiterführende Erklärung des Quicksorts bereitgestellt: Löcher graben und Zahlen einsetzen + Divide-and-Conquer.
Schauen wir uns zunächst ein Beispiel an. Die Definition ist unten angegeben (am besten fasst man die Definition in eigenen Worten zusammen, da dies bei der Implementierung des Codes hilft).
Nimm ein Array als Beispiel und nimm die erste Zahl im Intervall als Pivot.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
72 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 48 | 85 |
Anfangs ist i = 0; j = 9; X = a[i] = 72
Da die Zahl in a
Suche von j aus nach links nach einer Zahl, die kleiner oder gleich X ist. Wenn j=8, ist die Bedingung erfüllt. Grabe a aus
Das Array wird zu:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
48 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 88 | 85 |
i = 3; j = 7; X=72
Wiederhole die obigen Schritte: Suche zuerst von hinten nach vorne, dann von vorne nach hinten.
Suche von j aus nach links. Wenn j=5, ist die Bedingung erfüllt. Grabe a aus
Suche von i aus nach rechts. Wenn i=5, brich ab, weil i==j.
An diesem Punkt ist i = j = 5, und a
Das Array wird zu:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
48 | 6 | 57 | 42 | 60 | 72 | 83 | 73 | 88 | 85 |
Man erkennt, dass die Zahlen vor a
Fassen wir das Ausheben von Gruben und das Auffüllen von Zahlen zusammen:
Nach dieser Zusammenfassung ist es einfach, den Code für das Graben von Löchern und das Einfüllen von Zahlen zu implementieren:
Schreibe dann den Code für die Divide-and-Conquer-Methode:
Solcher Code ist offensichtlich nicht prägnant genug, also fasse ihn zusammen und räume ihn auf:
Es gibt viele verbesserte Versionen von Quicksort, z. B. die zufällige Auswahl des Pivots oder die direkte Verwendung einer anderen Sortiermethode, wenn weniger Daten im Intervall vorhanden sind, um die Rekursionstiefe zu reduzieren. Interessierte Freunde können dies weiter untersuchen.
Hinweis 1: Einige Bücher verwenden die mittlere Zahl als Pivot. Um dies umzusetzen, ist es sehr einfach – tauschen Sie einfach die mittlere Zahl mit der ersten Zahl.
Autor: MoreWindows
Originalartikel: https://blog.csdn.net/morewindows/article/details/6684558