Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke
Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke
Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />
23.4 Quicksort:<br />
Quicksort ist e<strong>in</strong>er der effizientesten <strong>und</strong> wahrsche<strong>in</strong>lich auch am häufigsten e<strong>in</strong>gesetzten Sortieralgorithmen.<br />
Die Funktionsweise <strong>die</strong>ses Sortierverfahrens ist nicht allzukompliziert, aber es ist dennoch<br />
nicht so e<strong>in</strong>fach, <strong>die</strong>ses auch fehlerfrei zu implementieren. Deshalb greift man meist auf entsprechende<br />
Bibliotheksfunktionen zurück (z. B. qsort() <strong>in</strong> stdlib.h).<br />
Die Idee des Algorithmus ist sehr e<strong>in</strong>fach:<br />
Man sucht sich zufällig e<strong>in</strong> Element aus dem Datenfeld aus (Oft als 'Pivot' bezeichnet), <strong>und</strong> zerteilt<br />
das Feld anschliessend <strong>in</strong> zwei Teile, <strong>und</strong> zwar so, dass im e<strong>in</strong>en Teil nur Zahlen grösser als der<br />
Pivot, <strong>und</strong> im anderen nur Zahlen kle<strong>in</strong>er oder gleich dem Pivot enthalten s<strong>in</strong>d. Anschliessend werden<br />
<strong>die</strong> beiden Teile mit dem genau gleichen Verfahren weiterbehandelt. Dies wiederholt man so<br />
oft bis <strong>die</strong> Grösse der Teilfelder 1 wird. Somit lässt sich Quicksort am e<strong>in</strong>fachsten rekursiv implementieren.<br />
Im Optimalfall würde das Feld <strong>in</strong> jedem Schritt exakt halbiert werden, was log2(N) Schritte ergeben<br />
würde, <strong>und</strong> jedem Schritt müssen etwa N-1 Vergleiche zwischen Zahlen <strong>und</strong> Pivot durchgeführt<br />
werden. Im optimalen Fall s<strong>in</strong>d somit nur N*log2(N) Vergleiche nötig. Da das Feld jedoch im Allgeme<strong>in</strong>en<br />
nicht <strong>in</strong> der Mitte halbiert wird, sondern an e<strong>in</strong>er zufälligen Stelle, ergeben sich im<br />
Durchschnitt 2*ln(N) * N oder 1.38*N*log2(N) Vergleiche, also etwa 38% mehr Aufwand (Siehe<br />
Robert Sedgewick, Algorithmen <strong>in</strong> <strong>C++</strong>).<br />
Im schlimmsten Fall wird immer das kle<strong>in</strong>ste oder grösste Element als Pivot gewählt, somit wird<br />
das Feld nicht geteilt, sondern nur um 1 verm<strong>in</strong>dert. In <strong>die</strong>sem Fall benötigt der Algorithmus N*N<br />
Vergleiche. Es gibt e<strong>in</strong>ige Verbesserungen, um <strong>die</strong>se Fälle zu vermeiden (Sedgewick, Knuth).<br />
Der Algorithmus heisst Quicksort, weil es e<strong>in</strong>es der schnellsten Sortierverfahren ist.<br />
Nachfolgend s<strong>in</strong>d <strong>die</strong> Arbeitsschritte von Quicksort an e<strong>in</strong>em Beispiel dargestellt. Es wird immer<br />
das mittlerste Element des Feldes als Pivot verwendet.<br />
Pass 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20<br />
1.0 10 13 2 17 12 1 21 8 20 5 6 11 19 18 15 4 9 3 7 14 16<br />
1.1 3 4 2 5 1 6 12 21 8 20 17 11 19 18 15 13 9 10 7 14 16<br />
2.0 3 4 2 5 1 6 12 21 8 20 17 11 19 18 15 13 9 10 7 14 16<br />
2.1 1 2 4 5 3 6 12 16 8 14 17 11 7 15 13 9 10 18 19 20 21<br />
3.0 1 2 4 5 3 6 12 16 8 14 17 11 7 15 13 9 10 18 19 20 21<br />
3.1 1 2 4 5 3 6 10 9 8 7 11 17 14 15 13 16 12 18 19 20 21<br />
4.0 1 2 4 3 5 6 10 9 8 7 11 17 14 15 13 16 12 18 19 20 21<br />
4.1 1 2 3 4 5 6 7 8 9 10 11 12 14 13 15 16 17 18 19 20 21<br />
5.0 1 2 3 4 5 6 7 8 9 10 11 12 14 13 15 16 17 18 19 20 21<br />
5.1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21<br />
6.0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21<br />
6.1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21<br />
7.0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21<br />
7.1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21<br />
Bereits am richtigen Platz / Sortiert<br />
Pivot<br />
Pivot aus früherer R<strong>und</strong>e, am richtigen Platz/Sortiert<br />
E<strong>in</strong> Problem von Quicksort ist, dass es nicht stabil ist, d.h. e<strong>in</strong>e ursprüngliche Ordnung bleibt nicht<br />
erhalten, man kann also nicht zuerst nach Vornamen, <strong>und</strong> dann nach Nachnamen sortieren um Leute<br />
mit gleichem Nachnamen nach Vornamen sortiert zu erhalten.<br />
Gedruckt am 11.09.2008 13:04:00 Letzte Änderung am: 11. September 2008 Version 2.4, I. Oesch 92/147