12.07.2015 Aufrufe

Sortieren durch Zerlegung: Quicksort - Informatik in der Oberstufe

Sortieren durch Zerlegung: Quicksort - Informatik in der Oberstufe

Sortieren durch Zerlegung: Quicksort - Informatik in der Oberstufe

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Informatik</strong> 12 mit Java:<strong>Sortieren</strong> <strong>durch</strong> Zerlegen (<strong>Quicksort</strong>)¡ ¢ £ ¤ ¥ £ ¦ §Allgeme<strong>in</strong>es<strong>Quicksort</strong> wurde 1960 von C.A.R. HOARE erfunden und gilt auch heute noch für die meistenFälle als schnellstes <strong>in</strong>ternes Sortierverfahren (für das <strong>Sortieren</strong> von Daten <strong>in</strong> externen Dateienbenutzt man an<strong>der</strong>e Algorithmen).<strong>Quicksort</strong> stützt sich auf die Tatsache, dass Austauschen vorzugsweise über größere Entfernungen(im Gegensatz zu Bubblesort) ausgeführt wird und dann am effizientesten ist. S<strong>in</strong>d z.B. ¨Elemente <strong>in</strong> umgekehrter Reihenfolge gegeben, so kann man sie mit nur © Austauschvorgängensortieren.Idee zum AlgorithmusMan wähle willkürlich e<strong>in</strong> Element (das Pivot-Element) und nenne es , <strong>durch</strong>suche dann dasArray von l<strong>in</strong>ks, bis e<strong>in</strong> Element gefunden wird, und von rechts, bis e<strong>in</strong> Elementgefunden wird. Nun werden diese beiden Elemente vertauscht, und dieser Prozess des Durchsuchensund Vertauschens wird so lange fortgesetzt, bis man sich beim Durchsuchen aus beidenRichtungen irgendwo trifft.Als Resultat dieses Vorgangs ist jetzt das Array zerlegt <strong>in</strong> e<strong>in</strong>en l<strong>in</strong>ken Teil, <strong>in</strong> dem alle Elementekle<strong>in</strong>er als s<strong>in</strong>d und e<strong>in</strong>en rechten Teil, <strong>in</strong> dem alle Elemente größer als s<strong>in</strong>d. Zwischen diesenbeiden Teilen s<strong>in</strong>d also ke<strong>in</strong>e Austauschvorgänge mehr nötig.Man hat also das Problem <strong>in</strong>soweit vere<strong>in</strong>facht, dass <strong>durch</strong> diesen Vorgang nur noch das <strong>Sortieren</strong><strong>der</strong> beiden Teile (nach dem gleichen Verfahren) übrig bleibt. Es ist e<strong>in</strong> Verfahren nach dem Pr<strong>in</strong>zipdivide and conquer (teile und herrsche) und führt dementsprechend auf e<strong>in</strong>e rekursive Methode.HandarbeitUm den unten auformulierten Algorithmus zu verstehen, muss man ihn an Beispielen <strong>in</strong> Handarbeitselbst mit Bleistift und Papier ausführen. Mache dies ausführlichst am Beispiel <strong>der</strong> Zahlenfolge8 2 1 7 9 5 3. Notiere jede Än<strong>der</strong>ung <strong>der</strong> Indizes und schreibe jeweils bei Vertauschung vonElementen die Folge neu auf.ProgrammierungDer Algorithmus kann erstaunlich knapp formuliert werden. Er ist aber äußerst empf<strong>in</strong>dlich gegenüberFehlern bei den Lauf<strong>in</strong>dizes bzw. bei den Vergleichen. Die kle<strong>in</strong>ste Än<strong>der</strong>ung führt zumAbsturz o<strong>der</strong> zu e<strong>in</strong>er fehlerhaften Sortierung.Als Pivot-Element wird hier <strong>der</strong> E<strong>in</strong>fachheit halber e<strong>in</strong> Element genommen, das so etwa <strong>in</strong> <strong>der</strong>Mitte liegt.1


static void quicksort(<strong>in</strong>t l<strong>in</strong>ks, <strong>in</strong>t rechts){ <strong>in</strong>t nachl<strong>in</strong>ks = rechts; // Lauf<strong>in</strong>dex, <strong>der</strong> vom rechten Ende nach l<strong>in</strong>ks laeuft<strong>in</strong>t nachrechts = l<strong>in</strong>ks; // Lauf<strong>in</strong>dex, <strong>der</strong> vom l<strong>in</strong>ken Ende nach rechts laeuftif (nachrechts < nachl<strong>in</strong>ks){ // Pivotelement bestimmen<strong>in</strong>t pivot = feld[(nachrechts + nachl<strong>in</strong>ks)/2];while (nachrechts l<strong>in</strong>ks) && (feld[nachl<strong>in</strong>ks] > pivot))nachl<strong>in</strong>ks--;// Wenn nicht ane<strong>in</strong>an<strong>der</strong> vorbei gelaufen, Inhalte vertauschenif (nachrechts l<strong>in</strong>ks) quicksort (l<strong>in</strong>ks, nachl<strong>in</strong>ks);// Rechten Teil sortierenif (nachrechts < rechts) quicksort (nachrechts, rechts);} // end if} // quicksortTestphaseTeste den Algorithmus nicht nur an Fel<strong>der</strong>n mit zufälligen Inhalten, son<strong>der</strong>n auch an fast schon“ ”sortierten Fel<strong>der</strong>n und umgekehrt sortierten Fel<strong>der</strong>n. Stelle das Zeitverhalten des Algorithmusgraphisch dar und stelle fest, wie die benötigte Zeit von <strong>der</strong> Anzahl <strong>der</strong> Elemente abhängt.Vergleiche die verschiedenen Fälle mit den an<strong>der</strong>en Sortieralgorithmen.Teste den Algorithmus auch mit e<strong>in</strong>er an<strong>der</strong>en Strategie zur Ermittlung des Pivot-Elementes, um¨auch die schlimmst-möglichen“ Fälle zu entschärfen.”2

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!