28.02.2014 Aufrufe

Informatik für Lehrkräfte

Informatik für Lehrkräfte

Informatik für Lehrkräfte

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.

I N FORMATIK F Ü R L EHRKRÄFTE 143<br />

Übungsaufgabe: Quick Sort dokumentieren<br />

Welche Aufrufe von partition! werden beim Aufruf von quick_sort!(a)<br />

mit a = [3,2,1,6,7,4,8,5] in welcher Reihenfolge ausgeführt? Geben<br />

Sie an, welchen Wert a vor und nach jedem Aufruf von partition! hat.<br />

Merge Sort<br />

Schließlich lernen wir noch ein Sortierverfahren kennen, deren Laufzeit<br />

auch im schlechtesten Fall in O(n · log 2 (n)) ist. Auch dieses Verfahren<br />

verwendet zwei rekursive Aufrufe zum Sortieren von Teilarrays, stellt<br />

aber sicher, dass sich dabei die Array-Größen unabhängig von den Array-<br />

Elementen halbieren, wodurch logarithmische Rekursionstiefe garantiert<br />

wird.<br />

Intuitiv können wir das Verfahren wie folgt beschreiben:<br />

1. Teile das Eingabe-Array in zwei Hälften und sortiere diese rekursiv.<br />

2. Durchlaufe dann die sortierten Hälften und füge sie zu einem Array<br />

zusammen, dass alle Elemente in sortierter Reihenfolge enthält.<br />

Die rekursiven Aufrufe verfahren nach dem selben Prinzip. Für die<br />

Eingabe [3,2,1,6,7,4,8,5] ergeben sich also die folgenden Zwischenschritte.<br />

Hierbei fassen wir Operationen auf gleicher Rekursionstiefe<br />

zusammen. Bei diesem Array der Größe acht ergeben sich also drei<br />

Schritte.<br />

• [3,2,1,6,7,4,8,5]<br />

• [2,3,1,6,4,7,5,8]<br />

• [1,2,3,6,4,5,7,8]<br />

• [1,2,3,4,5,6,7,8]<br />

Übungsaufgabe: Merge Sort implementieren und analysieren<br />

Definieren Sie eine rekursive Ruby-Funktion (keine Prozedur)<br />

merge_sort, die das Merge Sort Verfahren implementiert. Das<br />

Eingabe- Array soll von dieser Funktion nicht verändert werden. 1 Nach<br />

zwei rekursiven Aufrufen sollen die sortierten Hälften zusammengefügt<br />

werden. Definieren Sie dazu eine Funktion merge mit zwei Arrays als<br />

Parametern, die als Ergebnis ein sortiertes Array mit den Elementen<br />

beider Parameter liefert.<br />

Untersuchen Sie Ihre Implementierung experimentell. Wie verhalten<br />

sich die Laufzeiten in Abhängigkeit von der Eingabegröße?<br />

1<br />

Es ist nicht leicht den Merge-Schritt von<br />

Merge Sort in place, das heißt durch direkte<br />

Manipulation des Eingabe-Arrays zu<br />

implementieren. Einfacher ist es, ein neues<br />

Array zu erzeugen, dass die zusammengefügten<br />

Elemente enthält.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!