• Nenhum resultado encontrado

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-28

Algorithmus 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-Sort

Algorithmus 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