L A TEX
19.3 Quick-Sort
19.4.3 Analyse
19-27 Vor- und Nachteile von Distribution-Sort 19-27
Vorteile
+ Braucht nurO(k+n)Schritte.
+ Sehr einfach aufgebaut.
+ Erweiterungen können stabil gemacht werden.
+ Wennkbekannt und klein ist, ist ein Geschwindigkeitsvorteil vom Faktor 100 gegen- über sehr guten Standardalgorithmen möglich.
Nachteile
– kmuss bekannt sein (kann umgangen werden).
– Es müssen Zahlen sortiert werden (kann umgangen werden).
19 Schnelle Sortierverfahren und Rekursion
Zusammenfassung dieses Kapitels 165
Zusammenfassung dieses Kapitels
19-28
I
Merge-Sort 19-28Algorithmus Teile den Array in zwei Hälften. Sortiere diese rekursiv. Verschmelze die sor- tierten Ergebnislisten.
Laufzeit O(nlogn).
Vorteile Garantierte Laufzeit, stabil.
Nachteile Nicht in-place.
I
Quick-SortAlgorithmus Wähle ein Pivot-Element. Tausche Elemente so, dass im linken Teil alle Ele- mente kleiner als das Pivot-Element sind, im rechten alle größer. Sortire rekursiv beide Teile.
Laufzeit O(nlogn)im Schnitt,O(n2)im schlimmsten Fall.
Vorteile In der Praxis schneller als Merge-Sort, in-place.
Nachteile Sehr schlechte Laufzeit im schlimmsten Fall.
Übungen zu diesem Kapitel
Übung 19.1 Idee des rekursiven Medians, mittel
Mit jedem Sortieralgorithmus können Sie den Median eines Arrays bestimmen, indem Sie das Array sortieren und dann den mittleren Eintrag des sortierten Arrays auslesen (wir gehen hier von einem Array ungerader Länge aus). Allerdings kann man diese Aufgabe mit einer Variante des Quicksort- Algorithmus auch ein wenig eleganter lösen. Dies funktioniert so: Statt zwei rekursiven Aufrufen wie bei Quicksort, mit denen der linken und rechten Teil des Arrays sortiert wird, beschränkt man bei der Rekursion auf den Teil des Arrays, in der der Median liegen muss. Auch in dem so »halbsortierten«
Array steht dann am Ende der Median in der Mitte.
Machen Sie sich diese Vorgehensweise anhand des folgenden Arrays klar:
44,75,23,43,55,12,64,77,33
Geben Sie als Lösung mindestens die Grenzen der Array-Teile, das aktuelle Pivot-Element, und den aktuellen Stand des Arrays vor jedem rekursiven Aufruf an!
Übung 19.2 Rekursiven Median implementieren, schwer
Implementieren Sie den Algorithmus aus der vorherigen Aufgabe, indem Sie den Algorithmus aus der Vorlesung entsprechend abändern. Testen Sie anhand von drei Beispielen der Längen 9, 19 und 29, ob so der Median gefunden werden kann.
Übung 19.3 Laufzeit des rekursiven Medians, schwer
Wie ist im durchschnittlichen Fall ungefähr die Laufzeit dieses Verfahrens zur Mediansuche?
Prüfungsaufgaben zu diesem Kapitel
Übung 19.4 Quicksort verstehen, mittel, original Klausuraufgabe, mit Lösung Gegeben sei ein Array aus Integer-Werten:
int[] a = {36, 83, 96, 42, 1, 17, 28 }
Das Array soll mit Quicksort sortiert werden. Dazu wird die Funktionquicksortaus der Vorlesung wie folgt aufgerufen:
quicksort( a, 0, 6 )
1. Welches Pivot-Element wird gewählt?
2. Wie sieht das Arrayavor den ersten rekursiven Aufrufen vonquicksortaus?
3. Mit welchen Parametern (Grenzen der zu sortierenden Teilarrays) wirdquicksortdaraufhin rekursiv aufgerufen?
166 19 Schnelle Sortierverfahren und Rekursion Übungen zu diesem Kapitel
Übung 19.5 Quicksort verstehen, mittel, typische Klausuraufgabe Gegeben sei ein Array mit folgenden Einträgen:
47,14,46,84,52,88,60,30,87
Zeichnen Sie einen Aufrufbaum der rekursiven Aufrufe, die beim Sortieren dieses Arrays mit der Funktionquicksortentstehen. Geben Sie für jeden Aufruf das Pivot-Element und die linken und rechten Grenzen des zu sortierenden Teil-Arrays an.
Übung 19.6 Quicksort, leicht, mit Lösung
Folgende Zahlen sollen mit dem Quicksort-Algorithmus aus der Vorlesung sortiert werden:
-3 2 9 8 1 7 0
Zunächst wählt der Algorithmus ein Pivot-Element. Nun wird das Pivot-Element ans Ende des Arrays getauscht. Einefor-Schleife unterteilt das Array in eine »linke Seite« und eine »rechte Seite«. Am Ende wird das Pivot-Element zwischen den beiden Seiten eingefügt.
1. Wenn als Pivot-Element das mittlere Element gewählt wird, welchen Inhalt hat dann das Array bevor die rekursiven Aufrufe ausgeführt werden?
2. Auf welchen Teilarrays werden die rekursiven Aufrufe durchgefürt?
3. Warum sollte man das mittlere Element als Pivot-Element wählen und nicht das erste?
Teil V
Modellierung 167
Teil V
Modellierung
Goethe sagte einmal: »Mathematiker sind wie Franzosen: Wenn man ihnen etwas erzählt, übersetzen sie es in ihre eigene Sprache, und es bedeutet etwas ganz anderes.« Lebte Goethe heute, so würde er wahrscheinlich auch noch Compiler neben Mathematiker und Franzosen stellen: Beim Programmierung tut man »der Wirklichkeit« oft ein wenig Gewalt antun, um sie in Arrays und Strings zu pressen. (Eventuell hätte sich Goethe aber aus Rücksichtnahme auf den Zeitgeist Vergleiche mit bestimmten Geschlechtern und Nationalitäten verkniffen.) Die Sicht auf die Welt »durch die Brille des Übersetzers« kann zu einem echten Problem werden, wenn man an größeren Projekten arbeitet, vielleicht auch noch im Team. Am Ende versteht der Übersetzer, worum es geht, aber keiner der beteiligten Menschen. Wer schon einmal in den Programmtext eines Kommilitonen geschaut hat, weiß, was hier gemeint ist.
Mit den Jahren hat sich die Erkenntnis in der Informatik durchgesetzt, dass sich nicht die Wirklichkeit den Programmen anzupassen hat, sondern umgekehrt: Programmtexte sollten die Wirklichkeit in möglichst natürlicher Weise widerspiegeln. Statt über »zwei Arrays von Strings, wobei der erste Array die Vornamen und der zweite die Nachnamen der Studieren- den speichert« zu reden, will manschon im Programmtextüber »eine Liste von Studieren- den« reden.
Sogenannteobjektorientierte Programmiersprachen(Java ist eine solche) beherrschen sol- che Abbilder der Wirklichkeit im Rechner – man spricht vonModellen– besonders gut. In diesem Teil soll es nun darum gehen, wie man solche Modelle erstellt und aufschreibt.
168 20 Modularisierung im Großen
20-1 20-1
Kapitel 20
Modularisierung im Großen
Wie man große Probleme in genießbare Häppchen aufteilt
20-2 20-2
Lernziele dieses Kapitels
1. Das Konzept des Top-Down-Entwurf verstehen und anwenden können
2. Das Konzept der Klassen- und Modulbildung verstehen
Inhalte dieses Kapitels
20.1 Modularisierung von Software 169 20.1.1 Probleme im Großen . . . 169 20.1.2 Motivierende Problemstellung . . . 169 20.1.3 Modularisierungsebenen . . . 170 20.1.4 Softwareentwurf . . . 170
20.2 Klassen 171
20.2.1 Der Begriff der Klasse . . . 171 20.2.2 Java-Syntax von Klassen . . . 171 20.2.3 Benutzung von Klassen . . . 172 20.2.4 Zugriffsrechte . . . 172
20.3 Pakete 173
20.3.1 Der Begriff des Pakets . . . 173 20.3.2 Java-Syntax für Pakete . . . 173 20.3.3 Benutzung von Paketen . . . 174
Worum es heute geht
Worum es heute geht
Die mittelalterliche Gesellschaft war eine starkständischgeprägt. Es gab die Bürger, den Klerus und den Adel. Zur Zeit eines Karl Marx wurden die Stände theoretisch wie praktisch durchKlassenabgelöst, Menschen gehörten nun der proletarischen oder aber der kapitalisti- schen Klasse an. Heute ist in der Soziologie der Begriff derSchichtstate-of-the-art, es gibt Unterschichten, Mittelschichten, Oberschichten, akademische Schichten und viele mehr. All diesen Einteilungen von Menschen liegt eine Idee zugrunde: Übersichtlichkeit. Wie viel ein- facher wird die Welt, wenn man sich nicht mit dem Individuum auseinandersetzen muss, sondern mit einem Aggregat? Wie viel leichter ist es zu sagen, »Der Kapitalist ist böse« als
»Max ist böse« oder »Der Adel ist faul« als »Frau Fleißighuber ist faul«. Aus soziologischer Sicht ist jede Zusammenfassung von Menschen zu einer »Klasse« immer mit viel Vorsicht zu genießen, man prüfe genau, wer hier warum einen Klassenbegriff einführt.
In der Informatik dienen »Klassen« letztendlich demselben Zweck wie in der Soziologie:
Übersichtlichkeit. Statt Menschen werden wir späterObjektezu Klassen zusammenfassen;
in diesem Kapitel soll es aber darum noch nicht gehen, sondern lediglich um einen anderen ordnenden Aspekt von Klassen: Mit ihrer Hilfe verschafft man sich Ordnung, ordnet Me- thoden in zusammengehörige Gruppen, schützt verschiedene Programmteile voreinander.
Glücklicherweise sind derzeit keinerlei ethisch-moralischen Einwände gegen die Verwen- dung von Klassen innerhalb der Informatik bekannt. Menschen sind eben keine Objekte, das können Sie im Grundgesetz nachlesen. Sie dürfen also in Ihren Programmen ruhigen Gewissens mit Klassen Ordnung stiften.
20 Modularisierung im Großen