06.10.2013 Aufrufe

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

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!