Visualisierung der Sortieralgorithmen Bubblesort, Insertionsort und

Transcrição

Visualisierung der Sortieralgorithmen Bubblesort, Insertionsort und
Lehrveranstaltung „Systemprogrammierung“
Prof. Dr. Groß, Prof. Dr. Heinzel
WS 2007/2008
Visualisierung der
Sortieralgorithmen
Bubblesort, Insertionsort und
Selectionsort
Name
Vorname
McLaughlin Lisa
Wäldchen
Lisa
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
Inhaltsverzeichnis
Abbildungsverzeichnis _________________________________ 4
1. Projektbeschreibung (LM, LW) _________________________ 5
1.1 Thema_______________________________________________ 5
1.2 Ziel _________________________________________________ 5
1.3 Zielgruppe ___________________________________________ 6
1.4 Beschreibung der verwendeten Algorithmen _________________ 6
2. Anwendungsdokumentation ___________________________ 7
2.1 Kompilieren und Ausführen (LM) __________________________ 7
2.1.1. Systemvoraussetzungen ______________________________________ 7
2.1.2. Kompilieren und Ausführen ____________________________________ 7
2.2 Bedienung ___________________________________________ 7
2.2.1 Startfenster (LW) _____________________________________________ 8
2.2.2 AuswahlAlgorithmen (LW) _____________________________________ 8
2.2.3 Hauptfenster (LM) ____________________________________________ 9
2.2.3.1 Tab1 (LM) _______________________________________________ 10
2.2.3.2 Tab2 (LW)_______________________________________________ 12
2.2.3.3 Tab3 (LW)_______________________________________________ 14
3. Entwicklungsdokumentation__________________________ 16
3.1 Überblick (LW, LM) ____________________________________ 16
3.2 Programmierung der Algorithmen (LW, LM) ________________ 19
3.3 Programmierung des Paketes GUI ________________________ 20
3.3.1 Startfenster (LW) ____________________________________________ 20
3.3.2 AuswahlAlgorithmen (LW) ____________________________________ 20
3.3.3 Hauptfenster (LM, LW) _______________________________________ 21
3.3.3.1 Menü (LM) ______________________________________________ 22
3.3.3.2 Tab1 (LM, LW) ___________________________________________ 22
3.3.3.3 Tab2 (LW)_______________________________________________ 23
3.3.3.4 Tab3 (LW)_______________________________________________ 23
3.3.4 Saeule (LM) _________________________________________________ 24
3.4 Programmierung des Paketes Berechnungen (LW) ___________ 25
3.4.1 Tab2 _______________________________________________________ 25
3.4.2 Tab3 _______________________________________________________ 26
3.5 Programmierung des Paketes Steuerung
(LW, LM) __________ 26
3.5.1 MAIN _______________________________________________________ 26
3.6 Programmierung des Paketes Utilities _____________________ 27
3.6.1
3.6.2
3.6.3
3.6.4
3.6.5
Erklaerungen (LW) ___________________________________________ 27
GeschwindigkeitsEinstellung (LW) _____________________________ 27
Menuefenster (LM, LW) _______________________________________ 28
RandomArray (LM, LW) _______________________________________ 28
Zeitmessung (LW) ___________________________________________ 29
4. eingesetzte Werkzeuge und Basisliteratur (LW, LM) _______ 29
5. Darstellung relevanter Probleme und deren Lösung (LM, LW) 30
6. Darstellung des Aufwandes (LW, LM) ___________________ 32
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 2 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
7. Fazit (LM, LW)_____________________________________ 33
8. Quellen __________________________________________ 34
Die einzelnen Kapitel sind mit den Initialen der Verfasser gekennzeichnet.
Lisa McLaughlin LM
Lisa Wäldchen LW
Generell ist anzumerken, dass einige Kapitel, das heißt auch einige
Klassen im Programm zusammen entwickelt wurden, aus diesem Grund
sind dann beide Initialen zu lesen.
Genaue Informationen, wer was bearbeitet hat, sind der JavaDokumentation zu entnehmen.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 3 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
Abbildungsverzeichnis
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
Abbildung
1 - Startfenster _________________________________________________ 8
2 - AuswahlAlgorithmen __________________________________________ 8
3 - Tab Graphische Erklaerung ____________________________________ 10
4 - Tab "Zeitliche Berechnung"____________________________________ 12
5 - Fehler bei der Menge 1 _______________________________________ 12
6 - Fehlermeldung bei der Menge 2 ________________________________ 13
7 - Hilfefenster auf Tab2_________________________________________ 14
8 - Tab "Vergleich" _____________________________________________ 14
9 - Paket Algorithmen___________________________________________ 17
10 - Paket GUI ________________________________________________ 17
11 - Paket Berechnungen ________________________________________ 18
12 - Paket Steuerung ___________________________________________ 18
13 - Packet Utilities_____________________________________________ 18
15 - Klasse Startfenster _________________________________________ 20
16 - Klasse AuswahlAlgorithmen __________________________________ 20
17 - Singleton _________________________________________________ 21
18 - Klasse Saeule _____________________________________________ 24
19 - Klasse Tab2_______________________________________________ 25
20 - Klasse Tab3_______________________________________________ 26
21 - Klasse MAIN ______________________________________________ 26
22 - Klasse Erklaerungen ________________________________________ 27
23 - Klasse GeschwindigkeitsEinstellungen __________________________ 27
24 - Klasse MenueFenster _______________________________________ 28
25 - Klasse RandomArray ________________________________________ 28
26 - Klasse Zeitmessung ________________________________________ 29
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 4 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
1. Projektbeschreibung (LM, LW)
1.1 Thema
Im Rahmen der Ausarbeitung für das Fach Systemprogrammierung im
Wintersemester 2007 / 2008 haben wir uns für das Thema Visualisierung der
Sortieralgorithmen Bubblesort, Insertionsort und Selectionsort entschieden.
Die Funktionsweisen der verschiedenen Sortieralgorithmen wurden uns im 1.
Semester von Herrn Prof. Dr. Ehrenberger in dem Fach Algorithmen und
Datenstrukturen näher gebracht.
Wir haben uns für dieses Thema entschieden, da wir aus eigener Erfahrung
gemerkt haben, dass es schwierig sein kann, die Funktionsweise der
verschiedenen Sortieralgorithmen nur anhand des vorgegebenen Pseudocodes zu
verstehen.
Im Rahmen des Projektantrages wurde die Aufteilung wie folgt festgelegt:
Lisa McLaughlin
Visualisierung des Sortieralgorithmen anhand von Säulen
Paralleler Ablauf von Pseudocode
Umsetzung des Sortieralgorithmus Selectionsort
Lisa Wäldchen
Visualisierung der Oberfläche und Tabs
Zeitliche Berechnung der Sortierverfahren (Tab2)
Implementieren des Bubblesort- und des Insertionsort-Algorithmus
1.2 Ziel
Mit dieser Anwendung soll zunächst die Sortierung von einem Feld von
Zufallszahlen mit fester Größe durch die jeweilige Funktionsweise der drei
Algorithmen visualisiert werden.
Zudem soll es dem Nutzer auch möglich sein, eine Menge anzugeben, die der
Größe des zu sortierenden Feldes entspricht. Er soll dann Informationen über die
Dauer der Sortierung und die Anzahl an Vergleichen *I und Austauschen*²
innerhalb der Sortierung erhalten.
*I = Wie oft wurde eine Zahl mit einer anderen Zahl aus dem Feld verglichen?
*² = Wie oft wurde eine Zahl mit einer anderen Zahl aus dem Feld getauscht?
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 5 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
1.3 Zielgruppe
Generell soll die fertige Anwendung primär zum besseren Verständnis der
Funktionsweisen der Sortieralgorithmen dienen.
Dadurch, dass wir versuchen wollen, die Erklärungen so einfach wie möglich zu
gestalten, ist es für jeden gedacht, der sich für das Thema interessiert.
Natürlich soll es auch hilfreich für die Studenten sein, da, wie bereits erwähnt,
Herr Ehrenberger unter anderem diese Sortieralgorithmen in seinem Unterricht
durchnimmt. Unser Programm soll sie von daher beim Lernen unterstützen.
Außerdem kann es auch dem Professor zu Demonstrationszwecken dienen.
1.4 Beschreibung der verwendeten Algorithmen
Im Folgenden werden kurz die verwendeten Algorithmen erklärt, damit ein
Eindruck entsteht, was genau bei den Sortiervorgängen passiert.
Bubblesort
„Der Algorithmus vergleicht der Reihe nach zwei benachbarte Elemente und
vertauscht sie, falls sie in der falschen Reihenfolge vorliegen. Dieser
Vorgang wird solange wiederholt, bis keine Vertauschungen mehr nötig sind.
Hierzu sind in der Regel mehrere Durchläufe erforderlich.“
Insertionsort
„Der Algorithmus entnimmt der unsortierten Eingabefolge ein beliebiges
(z.B. das erste) Element und fügt es an richtiger Stelle in die (anfangs
leere) Ausgabefolge ein.“ Hier werden alle größeren Elemente als das
aktuelle nach hinten geschoben, bis dies nicht mehr möglich ist.
Selectionsort
„Sei S der sortierte Teil des Arrays und U der unsortierte Teil. Am Anfang ist
S noch leer, U entspricht dem ganzen Array. Das Sortieren durch Auswählen
funktioniert so:
Suche das kleinste Element in U und vertausche es mit dem ersten Element.
Danach ist das Array bis zu dieser Position sortiert. S ist um ein Element
gewachsen, U um ein Element kürzer geworden. Anschließend wird das
Verfahren solange wiederholt, bis das gesamte Array abgearbeitet worden
ist.“
Zitate: [Quelle 1]
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 6 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
2. Anwendungsdokumentation
2.1 Kompilieren und Ausführen (LM)
2.1.1. Systemvoraussetzungen
Um das Programm ausführen zu können, muss eine Java Laufzeitumgebung
installiert sein.
2.1.2. Kompilieren und Ausführen
Unter Windows
Um das Programm unter den einzelnen Betriebssystemen von Windows zu
starten, haben wir eine jar-Datei erstellt, die bei Benutzung die MAIN.java
ausführt (und somit das gesamte Programm startet).
Unter Solaris
Um das Programm unter dem Betriebssystem Solaris auszuführen, ist es
notwendig folgende Befehle einzugeben: javac MAIN.java. Dieser Befehl
kompiliert das Programm. Erfolgt die Kompilierung ohne Fehlermeldungen folgt
der Befehl: java MAIN. Durch diesen Befehl wird das Programm gestartet.
2.2 Bedienung
Das Programm ist so entwickelt worden, dass es zum größten Teil
selbsterklärend ist. Funktionen, die zusammen gehören wurde immer auf einen
Tab platziert. Für den Fall, dass Fragen zu dem Programm entstehen, wurde eine
Hilfe in der Menüleiste eingefügt.
Im Folgenden wird die Bedienung des gesamten Programms erläutert.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 7 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
2.2.1 Startfenster (LW)
Abbildung 1 - Startfenster
Nachdem das Programm gestartet wird, erscheint als aller erstes ein kleines
Startfenster. Dieses dient dazu, einen ersten Eindruck zu vermitteln. Nach
unserer Definition sollte ein Startfenster mindestens ein Logo mit dem Namen
des Programms und die Namen der Programmierer enthalten und anzeigen.
Hierzu haben wir selbst ein Logo mit einem Slogan entworfen, bei dem man im
Hintergrund die Pseudocodes der jeweiligen Sortierverfahren erkennen kann. Bei
dem Programmnamen haben wir uns für sorty entschieden. Gesamt betrachtet
kann man sagen, dass das Logo mit dem dazu gehörigen Slogan den von uns
gewünschten ersten Eindruck „Mit Spaß Lernen“ vermittelt.
Die Dauer, wie lange das Startfenster angezeigt wird, haben wir auf 5 Sekunden
beschränkt.
2.2.2 AuswahlAlgorithmen (LW)
Abbildung 2 - AuswahlAlgorithmen
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 8 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
Nach dem Startfenster wird automatisch das Auswahlfenster angezeigt. In
diesem Fenster kann man sich nun entscheiden, über welches Sortierverfahren
man sich näher informieren möchte. Aus diesem Grund stehen einem drei
Buttons zur Verfügung, da in unserem Programm die Arbeitsweisen von drei
Sortierverfahren erklärt werden.
Dieses Fenster ist sehr übersichtlich und bietet noch keine Hilfen.
Durch Betätigen eines Buttons gelangt man zu dem dementsprechenden
Hauptfenster.
2.2.3 Hauptfenster (LM)
Das Hauptfenster ist in drei Tabs unterteilt. Jeder Tab beinhaltet eine andere
Funktion, die im Anschluss näher erläutert werden.
Im oberen Bereich befindet sich die Menüleiste. Unter dieser Menüleiste sind drei
Punkte zu finden: Menue, Algorithmen und Hilfe. Unter dem Punkt Menue hat
man die Möglichkeit, zurück in das Auswahlfenster zu gelangen, um einen
anderen Sortieralgorithmus auszuwählen oder das Programm zu beenden. Unter
dem Punkt Algorithmen werden die einzelnen Sortieralgorithmen aufgelistet und
beschrieben. Im Punkt Hilfe gibt es verschiedene Hilfepunkte, die helfen sollen,
das Programm zu verstehen. Zusätzlich gibt es hier weitere Informationen über
das Programm und dessen Hintergrund.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 9 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
2.2.3.1 Tab1 (LM)
Auf dem ersten Tab „Graphische Erklärung“ wird der Sortiervorgang visuell
dargestellt. Um es besonders umfangreich darzustellen gibt es drei
Hauptbereiche, in dem die Visualisierung stattfindet.
Abbildung 3 - Tab Graphische Erklaerung
Punkt 1
Hier findet die bildliche Darstellung der Zahlen statt, die sortiert werden. Die
Zahlen sind zufällig gewählt und werden während dem Sortiervorgang markiert
und getauscht, damit der Ablauf des Algorithmus deutlich wird.
Punkt 2
In diesem Teil ist der Pseudocode des ausgewählten Sortieralgorithmus zu sehen.
Hier werden die Zeilen markiert, die während dem Sortiervorgang abgearbeitet
werden.
Punkt 3
Hier werden schriftliche Erklärungen zu dem Ablauf des Algorithmus gezeigt, die
den Sortiervorgang beschreiben. Zu jeder Zeile Code gibt es eine Erklärung, die
verdeutlichen soll, was genau geschieht und warum.
Alle drei Bereiche laufen parallel zueinander ab, sodass eine umfangreiche
Erklärung des Programms stattfindet.
Punkt 4
Durch das klicken des Buttons Sortiere wird der Sortierprozess gestartet und die
Visualisierung findet statt.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 10 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
Punkt 5
Der Button Pause ermöglicht es dem Anwender, den Prozess zu pausieren.
Dadurch hat man Zeit, die Erklärungen zu lesen und sich den Code genauer
anzusehen. Durch erneutes klicken des Buttons wird der Sortiervorgang wieder
aufgenommen.
Punkt 6
Durch den Button Stop wird der Sortiervorgang abgebrochen. Es können dann
neue Zufallszahlen erzeugt oder ein anderer Sortieralgorithmus auswählt werden.
Punkt 7
Mit dem Button neue Randomzahlen kann eine neue Menge von Zufallszahlen
erzeugt und angezeigt werden, die dann sortiert werden können.
Punkt 8
Der Slider dient dazu, die Schnelligkeit des Sortiervorgangs zu bestimmen. Dies
muss eingestellt werden, bevor das Sortieren gestartet wird. Während dem
Sortieren kann die Geschwindigkeit nicht geändert werden, da man ja immer die
Möglichkeit hat, die Sortierung abzubrechen und die Geschwindigkeit zu ändern.
Punkt 9
Der Button Beenden in der rechten unteren Hälfte beendet das gesamte
Programm und schließt das Fenster.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 11 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
2.2.3.2 Tab2 (LW)
Im zweiten Tab hat man nun die Möglichkeit, je nach Sortierverfahren eine
zeitliche Berechnung durchzuführen. In diesem Fall nutzen wir jetzt den
Bubblesort-Algorithmus. In den folgenden Schritten wird erklärt, was man auf
diesem Tab für Möglichkeiten hat und welche Informationen genau angezeigt
werden.
1
2
3
4
5
8
6
7
9
Abbildung 4 - Tab "Zeitliche Berechnung"
Punkt 1
Zunächst kann man bei diesem Punkt feststellen, dass man sich auf dem Tab
Zeitliche Berechnung befindet.
Punkt 2
Hier hat der Nutzer nun die Möglichkeit, eine Menge zwischen 1 und 200.000
einzugeben. Diese Zahl beschreibt die Größe des zu sortierenden Arrays. Dieses
Array wird dann mit Zufallszahlen erstellt, die zwischen 1 und der angegebenen
Zahl sein können.
Diese Menge wurde beschränkt, da bei größeren Zahlen die Sortierung zu lange
dauert und die Sortierung nicht abgebrochen werden kann. 200.000 dauert
schon sehr lange, wir wollten aber dem Nutzer nicht die Möglichkeit nehmen,
eine hohe Zahlenmenge zu testen. Wenn man eine Zahl außerhalb des
festgelegten Bereiches eingibt, erscheint folgendes Fenster:
Abbildung 5 - Fehler bei der Menge 1
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 12 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
Für den Fall, dass bei der Zeit 0 Millisekunden das Ergebnis ist, sollte man
einfach höhere Zahlen ausprobieren. Durch verschiedene Tests haben wir
herausgefunden, dass sich Zahlen zwischen 2000 und 8000 am Besten zum
Ausprobieren eignen.
Für den Fall, dass man eine falsche Eingabe tätigt, wie zum Beispiel Buchstaben,
oder das man gar keine Eingabe macht, wird folgendes Fenster angezeigt:
Abbildung 6 - Fehlermeldung bei der Menge 2
Punkt 3
Mit dem Button „Sortiere…“ startet man die Sortierung mit dem jeweiligen
Sortierverfahren.
Punkt 4
In diesem Fenster wird die Zeit / Dauer angezeigt, die der Sortieralgorithmus für
den Sortiervorgang benötigt. Diese Angabe wird in Millisekunden angegeben.
Diese Dauer in Sekunden anzuzeigen, wäre nicht ratsam gewesen, da die
Sortierung meist nicht sehr lange dauert und man so genauere Angaben erhält.
Punkt 5
Bei der Sortierung eines Feldes werden nacheinander nach verschiedenen
Algorithmen zwei Elemente miteinander verglichen. In diesem Feld wird nun die
Anzahl angezeigt, wie oft insgesamt bei einer Sortierung zwei Elemente
miteinander verglichen wurden.
Punkt 6
Die Anzeige in diesem Fenster entspricht der Anzahl, wie oft bei der gesamten
Sortierung zwei Elemente miteinander vertauscht wurden. Je nach
Sortierverfahren gibt es unterschiedliche Regeln, wann zwei Elemente getauscht
werden sollen. Beim Bubblesort werden sie sofort getauscht, wenn das erste
Element größer als das zweite ist und beim Selectionsort zum Beispiel wird erst
das gesamte Feld durchsucht, und dann wird getauscht.
Auf jeden Fall wird in diesem Feld die Anzahl angegeben, wie oft zwei Elemente
miteinander getauscht wurden.
Punkt 7
Dieser Button soll dazu dienen, nach einer Sortierung den Inhalt folgender Felder
zu leeren:
Das Feld, indem
der Nutzer die Menge angeben kann.
die Dauer angezeigt wird.
die Anzahl an Vergleichen angezeigt wird.
die Anzahl an Austauschen angezeigt wird.
Dies soll grundsätzlich der Übersicht dienen, denn wenn man die Werte nach der
ersten Sortierung stehen lässt und dann eine größere Menge angibt, dass heißt,
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 13 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
die Sortierung länger dauert, kann es dazu führen, dass der Nutzer verwirrt ist,
da die Zahlen von der alten Sortierung noch angezeigt werden.
Punkt 8
Die Buttons mit den Fragezeichen sollen dem Nutzer als Hilfe dienen, wenn er bei
den Feldern Menge, Anzahl der Vergleiche und Anzahl der Austausche fragen hat.
Beim Klicken erscheint ein neues Fenster, in dem eine kurze Erklärung zu dem
jeweiligen Punkt zu lesen ist. Im Folgenden ist eins von den drei Hilfefensters zu
sehen.
Abbildung 7 - Hilfefenster auf Tab2
Punkt 9
Dieser Button dient dazu, das Programm zu beenden.
2.2.3.3 Tab3 (LW)
1
2
8
3
4
5
6
7
9
Abbildung 8 - Tab "Vergleich"
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 14 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
Punkt 1
Diese Anzeige gibt dem Nutzer an, dass er sich bei dem Tab „Vergleich“ befindet,
mit dem eine Menge eingeben kann, die mit allen drei Sortierverfahren sortiert
wird und anschließend die Dauer der Sortierung angezeigt wird.
Punkt 2
Hier hat der Nutzer nun die Möglichkeit, eine Menge zwischen 1 und 200.000
einzugeben. Diese Zahl beschreibt die Größe des zu sortierenden Arrays. Dieses
Array wird dann mit Zufallszahlen erstellt, die zwischen 1 und der angegebenen
Zahl sein können.
Diese Menge wurde beschränkt, da bei größeren Zahlen die Sortierung zu lange
dauert und die Sortierung nicht abgebrochen werden kann. 200.000 dauert
schon sehr lange, wir wollten aber dem Nutzer nicht die Möglichkeit nehmen,
eine hohe Zahlenmenge zu testen. Wenn man eine Zahl außerhalb des
festgelegten Bereiches eingibt, erscheint ein Fenster, das den Nutzer darauf
aufmerksam macht, dass Zahlen zwischen 1 und 200.000 möglich sind. Ein
Beispiel für das Fenster ist unter dem Punkt 2.2.3.2 Tab „Zeitliche Berechnung“
zu sehen.
Für den Fall, dass bei der Zeit 0 Millisekunden das Ergebnis ist, sollte man
einfach höhere Zahlen ausprobieren. Durch verschiedene Tests haben wir
herausgefunden, dass sich Zahlen zwischen 2000 und 8000 am Besten zum
Ausprobieren eignen.
Für den Fall, dass man eine falsche Eingabe tätigt, wie zum Beispiel Buchstaben,
erscheint ein Fenster, dass dem Nutzer anzeigt, was er eingeben kann. Ein
Beispiel für das Fenster ist im Punkt 2.2.3.2 Tab „Zeitliche Berechnung“ zu
sehen.
Punkt 3
Mit dem Button „Sortiere…“ startet man die Sortierung mit dem jeweiligen
Sortierverfahren.
Punkt 4
In diesem Textfeld wird die Zeit / Dauer angezeigt, die der Sortieralgorithmus für
den Sortiervorgang mit dem Sortierverfahren Bubblesort benötigt.
Punkt 5
Hier wird angezeigt, wie lange die Sortierung mit dem Sortierverfahren
Insertionsort gedauert hat.
Punkt 6
Dieses Textfeld repräsentiert die Dauer der Sortierung mit dem Sortierverfahren
Selectionsort.
Punkt 4 bis 6
Diese Angaben werden in Millisekunden angegeben. Diese Dauer in Sekunden
anzuzeigen, wäre nicht ratsam gewesen, da die Sortierung meist nicht sehr lange
dauert und man so genauere Angaben erhält.
Durch mehrere Tests haben wir herausgefunden, dass der Insertionsort mit
seiner Funktionsweise jeweils am schnellsten sortiert und der Selectionsort
ungefähr doppelt so lange braucht.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 15 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
Der Bubblesort benötigt durch seine Art und Weise ein Vielfaches mehr Zeit als
die anderen beiden Sortierverfahren.
Punkt 7
Dieser Button soll dazu dienen, nach einer Sortierung den Inhalt folgender Felder
zu leeren:
Das Feld, indem
der Nutzer die Menge angeben kann.
die Dauer der Sortierung mit dem Bubblesort angezeigt wird.
die Dauer der Sortierung mit dem Insertionsort angezeigt wird.
die Dauer der Sortierung mit dem Selectionsort angezeigt wird.
Dies soll grundsätzlich der Übersicht dienen, denn wenn man die Werte nach der
ersten Sortierung stehen lässt und dann eine größere Menge angibt, dass heißt,
die Sortierung länger dauert, kann es dazu führen, dass der Nutzer verwirrt ist,
da die Zahlen von der alten Sortierung noch angezeigt werden.
Punkt 8
Der Button mit dem Fragezeichen soll dem Nutzer als Hilfe dienen, wenn er bei
dem Feld Menge fragen hat. Beim Klicken erscheint ein neues Fenster, in dem
eine kurze Erklärung zu lesen ist. Ein Beispiel des Hilfefensters kann man unter
Punkt 2.2.3.2 Tab „Zeitliche Berechnung“ sehen.
Punkt 9
Dieser Button dient dazu, das Programm zu beenden.
3. Entwicklungsdokumentation
3.1 Überblick (LW, LM)
Das Programm „sorty“ verwendet bei der Hierarchie zur Übersicht zunächst
Pakete, die dann die einzelnen dazugehörigen Klassen beinhalten. Diese
Hierarchie ist im Folgenden beschrieben.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 16 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
Zunächst gibt es das Paket Algorithmen, indem folgende Klassen enthalten sind:
Abbildung 9 - Paket Algorithmen
Des Weiteren existiert das Paket GUI mit folgenden Klassen:
Abbildung 10 - Paket GUI
Die Berechnungen innerhalb des zweiten und dritten Tabs haben wir in das Paket
Berechnungen ausgelagert. Dieses Paket sieht wie folgt aus:
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 17 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
Abbildung 11 - Paket Berechnungen
Da die Main-Klasse die wichtigste Klasse für das Programm ist, haben wir uns
dazu entschlossen, ein Packet Steuerung einzuführen, in dem diese Klasse
untergebracht ist.
Abbildung 12 - Paket Steuerung
Für alle Hilfsklassen haben wir ein extra Paket erstellt, das wir mit dem Namen
Utilities versehen haben. Darin sind folgende Klassen vorzufinden:
Abbildung 13 - Packet Utilities
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 18 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
In den folgenden Punkten wird auf die einzelnen Pakete und deren Klassen näher
eingegangen. Detaillierte Informationen sind der Java-Dokumentation oder dem
Quellcode im Anhang zu entnehmen.
3.2 Programmierung der Algorithmen (LW, LM)
Zunächst haben wir uns bei der Programmierung der Algorithmen an das Skript
von Herrn Prof. Dr. Ehrenberger [Quelle 2] gehalten. In seinem Skript
Algorithmen und Datenstrukturen sind der Insertionsort und der Selectionsort so
beschrieben, dass wir den Code einfach umsetzen konnten. Beim Bubblesort
jedoch haben wir uns Anregungen von einer Internetseite [Quelle 3] geholt und
dementsprechend angepasst und umgesetzt.
Abbildung 14 – Klassen BubbleSort, InsertionSort und SelectionSort
Diese Klassen führen eine Sortierung von einem Zahlenarray durch, der von der
Hauptklasse übergeben wird. Die Zahlenmenge wird je nachdem mittels dem
Bubblesort-, Insertionsort- oder Selectionsort-Algorithmus sortiert. Der
Sortiervorgang kann in zwei Varianten gestartet werden.
Um die zeitliche Berechnung durchzuführen (Tab2) werden jeweils die Methoden
startBubbleOhneVis(), startInsertionOhneVis() oder startSelectionOhneVis()
verwendet. Dabei wird die Zeit gestoppt, die der Algorithmus benötigt, um das
Array zu sortieren und zusätzlich noch wie oft Zahlen verglichen und getauscht
werden.
Die zweite Variante ermöglicht das Visualisieren des Sortiervorgangs. Dazu wird
jeweils ein zusätzlicher Thread gestartet, die dann, mittels der Referenz auf das
Objekt der Klasse Hauptfenster.java, Methoden aus dem Hauptfenster aufrufen.
Dadurch wird der Sortiervorgang für den Anwender sichtbar.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 19 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
3.3 Programmierung des Paketes GUI
3.3.1 Startfenster (LW)
Abbildung 15 - Klasse Startfenster
Diese Klasse erstellt für eine von der Main-Klasse übergebene Zeit ein Fenster,
welches als Einleitung für das Programm dienen soll. Hierzu wird von der MAIN
der Konstruktor aufgerufen. Darin wird die Methode startBildZeigen() aufgerufen,
die dann das Fenster erstellt (Größe, Rand,…) Hierbei werden ein Bild, der
Programmname und das Label mit den Namen der Programmierer hinzugefügt.
Nach Ablauf der übergebenen Zeit wird das Startfenster ausgeblendet und das
Fenster mit der Auswahl der Algorithmen erscheint.
3.3.2 AuswahlAlgorithmen (LW)
Abbildung 16 - Klasse AuswahlAlgorithmen
Das Auswahlfenster erscheint nach dem Startfenster und stellt drei Buttons zur
Verfügung. Mit diesen drei Buttons kann man sich für einen Sortieralgorithmus
entscheiden. Das Startfenster startet den Konstruktor, der das Fenster erstellt
(Größe, …) und auch die Buttons. Diese werden dann mit dem Label, auf dem die
Schrift zu finden ist, auf das Panel gesetzt und dann dem Frame (Fenster)
hinzugefügt. Wenn man einen der Buttons gedrückt, wird im ActionListener
zunächst unterschieden, um welchen Button / Algorithmus es sich handelt. Dann
wird das jeweilige Hauptfenster erstellt Dies geschieht mit Hilfe der
Hauptfenster-Instanz (Singleton), die im Folgenden noch näher beschrieben
wird.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 20 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
3.3.3 Hauptfenster (LM, LW)
Graphik siehe Anhang
In der Klasse Hauptfenster.java wird die eigentliche Graphische Oberfläche des
Programms erzeugt und zusammengestellt. Es werden drei Tabs und eine
Menüleiste, alles Buttons und der Slider erzeugt und auf ein Frame, an die
entsprechenden Stellen gesetzt.
Auf die verschiedenen Tabs und der Menüleiste wird im Anschluss genauer
eingegangen.
Die Methode getInstance() bringt folgende Funktion mit sich:
„Das Singleton ist ein in der Softwareentwicklung eingesetztes Entwurfsmuster
und gehört zur Kategorie der Erzeugungsmuster. Es verhindert, dass von einer
Klasse mehr als ein Objekt erzeugt werden kann. Dieses Einzelstück ist darüber
hinaus üblicherweise global verfügbar.“ [Quelle 1]
Da mehrere Klassen, unter Anderem die einzelnen Sortierverfahren und einige
Utilitie-Klassen, Zugriff benötigen, haben wir uns dazu entschlossen, dieses
Muster anzuwenden. In der Dokumentation ist unter dem Punkt 5. Darstellung
relevanter Probleme und deren Lösung ein weiterer Grund beschrieben, warum
wir ein Singleton eingesetzt haben. Des Weiteren ist doch der Quellcode
angegeben.
Im Folgenden ist nun das UML-Diagramm von dem Singleton zu sehen:
Abbildung 17 - Singleton
Generell ist noch zu beachten, dass bei der Verwendung eines Singletons der
Konstruktor private sein sollte.
Nun steht das Objekt und damit auch alle Methoden der Klasse Hauptfenster
global mit folgendem Aufruf zur Verfügung:
Hauptfenster.getInstance(„“)
Nach dem Konstruktor folgen zunächst etliche Klassen, die dazu dienen, die
einzelnen Textfelder auf dem Hauptfenster mit Strings zu „beschreiben“. Diese
Methoden werden dann zum Beispiel von den Klassen des Paketes Algorithmen
oder Utilities genutzt und aufgerufen.
Nach diesen Methoden folgen einige, die für die visuelle Sortierung auf dem
ersten Tab dienen. Mit deren Hilfe werden die Säulen z.B. markiert oder die
Markierung wieder gelöscht.
Danach bis zum Ende der Klasse sind alle ActionListener aufzufinden, die für den
reibungslosen Ablauf nötig sind.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 21 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
3.3.3.1 Menü (LM)
In der Menüleiste befinden sich die Punkte Menue, Algorithmen und Hilfe. Unter
dem Punkt Menue hat man die Möglichkeit in das Auswahlfenster zurück zu
gelangen. Dafür wird das Hauptfenster mit der Methode dispose() geschlossen
und ein neues Objekt der Klasse AuswahlAlgorithmen.java erzeugt. Des Weiteren
hat man unter dem Punkt Menue die Möglichkeit das Programm zu beenden.
Unter den Punkten Algorithmen und Hilfe wird jeweils ein Objekt der Klasse
Menuefenster.java erstellt. Diese Klasse erzeugt ein JFrame in dem jeweils der
entsprechende Text geladen wird. Es werden die einzelnen Sortieralgorithmen
erklärt, die das Programm verwendet und es gibt Informationen und Erklärungen
zu dem Programm.
3.3.3.2 Tab1 (LM, LW)
Auf dem ersten Tab Graphische Erklaerung wird der vorher ausgewählte
Sortieralgorithmus Visualisiert, indem eine Graphik, der Pseudocode des
Algorithmus und eine schriftliche Erklärung gezeigt werden. Diese Komponenten
laufen parallel zueinander ab.
Auf diesem Tab wurde ein JPanel gesetzt ohne LayoutManager, auf dem alle
Komponenten pixelgenau gesetzt werden.
In der linken oberen Hälfte wurde die Graphik platziert. Hier wird ein JPanel
erzeugt auf dem zunächst eine Menge von Zufallszahlen durch Säulen graphisch
dargestellt wird. Die Säulen werden durch die Klasse Saeule.java mittels der
Methode paintComponent() gezeichnet. Für jede Zahl wird ein Objekt dieser
Klasse mit einer bestimmten Größe, Position und Farbe erzeugt. Diese Parameter
wurden als statische Variablen festgelegt.
Während dem Sortiervorgang werden die Methoden zeichneRahmen() und
loescheSaeule() aufgerufen, um das Sortieren der Zahlen zu zeigen. Gesteuert
wird der Sortiervorgang mittels den Buttons Sortiere, Pause und Stop. Sortiere
startet den Sortiervorgang, indem der ActionListener sortiereButton() die
Methode
starteSortierenBubble(),
starteSortierenInsertion()
oder
starteSortiereSelection() aufruft.
Der Button Pause lässt den Sortiervorgang pausieren, solange bis dieser Button
erneut gedrückt wird. Er ruft die Methode pause() der jeweiligen
Algorithmusklasse auf.
Der Button Stop bricht den Sortiervorgang ab. Hierfür wird die Methode stop()
aufgerufen, die den Thread beendet.
Der Button neue Randomzahlen erzeugt eine neue Menge Zufallszahlen, die
gezeichnet werden und der Sortiervorgang kann erneut gestartet werden.
Der Slider dient dazu, die Geschwindigkeit der Sortierung festzulegen. Bevor die
Sortierung gestartet wird, kann die Geschwindigkeit mittels der Klasse
GeschwindigkeitsEinstellung.java verändert werden. Durch die Methode sleep()
in den Klassen Bubblesort.java, Insertionsort.java und Selectionsort.java wird die
Sortierung verzögert, damit die Visualisierung für den Anwender sichtbar wird.
In der rechten oberen Hälfte des Frames wird der Pseudocode des Algorithmus
gezeigt. Hierfür wird ein JTextArea erzeugt und der entsprechende Text hinein
gesetzt. Durch das Aufrufen der Methode zeileMarkieren() werden einzelnen
Zeilen mittels einem Highlighter markiert, um deutlich zu machen, welcher Teil
des Algorithmus zurzeit bearbeitet wird. Das Markieren der Zeilen und das
Zeichnen der Säulen läuft parallel zueinander ab.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 22 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
In der linken unteren Hälfte des Frames wurde ein JTextArea gesetzt, um hier
eine schriftliche Erklärung zu zeigen. Dafür wird zu jeder Zeile des Pseudocodes
eine Erklärung in das JTextArea geschrieben. Die Erklärungen befindet sich in der
Klasse Erklaerungen.java und werden mittels der Methode setzeErklaerungen()
in das JTextArea geschrieben. Dies läuft ebenfalls parallel zu der Graphik und
dem Pseudocode ab, sodass eine rundum Erklärung des Algorithmus stattfindet.
3.3.3.3 Tab2 (LW)
Der zweite Tab trägt zunächst den Namen Zeitliche Berechnung. Dass bedeutet,
dass im Grunde hier die Dauer einer Sortierung mit dem jeweiligen
Sortierverfahren gemessen und angezeigt wird.
Generell wurde für diesen Tab kein Layoutmanager benutzt, sodass wir alle
Elemente Pixelgenau nach unseren Vorstellungen setzen konnten. Hier gibt es
nun insgesamt 4 Textfelder, in denen die Angaben der Sortierung angezeigt
werden, und 4 Labels, die jeweils eine kleine Beschreibung der Textfelder
enthalten. Die Textfelder wurden, bis auf das Feld „Menge“, auf nichtveränderbar gesetzt, da diese Felder nur zu Demonstrationszwecken dienen.
Des Weiteren sind auf diesem Tab 3 Hilfebuttons zu finden, die durch ein kleines
Fragezeichen gekennzeichnet sind. Diese werden jeweils den ActionListenern
hinzugefügt, die dann mit Hilfe der Klasse Menuefenster.java ein Menü-, bzw. ein
Hilfefenster erstellt.
Der Button „Sortiere…“ wird auch dem ActionListener hinzugefügt, der dann die
Berechnungen mit Hilfe der Klasse Tab2.java durchführt.
Der Button „Felder leeren“ wird ebenfalls dem ActionListener hinzugefügt, der die
4 zur Verfügung stehenden Textfelder mit leeren Strings füllt und so für den
Nutzer „leert“.
Auch der „Beenden“ Button wird dem ActionListener hinzugefügt, der dann das
gesamte Programm mit einem System.exit(0) beendet.
3.3.3.4 Tab3 (LW)
Der dritte Tab ähnelt stark dem zweiten Tab. Er trägt die Bezeichnung
„Vergleich“ und stellt daraus resultierend einen zeitlichen Vergleich zwischen den
3 Sortierverfahren dar.
Generell wird auch hier kein Layoutmanager genutzt. Insgesamt gibt es auch hier
4 Textfelder, in eines kann der Nutzer eingaben machen und durch die anderen
drei werden dem Nutzer Angaben zur Sortierung gemacht. Aus diesem Grund
sind diese drei Textfelder auf nicht-veränderbar gesetzt.
Es existieren auch 4 Labels, die Informationen zu den Textfeldern enthalten.
Ergänzend sind auch hier die Hilfebuttons mit den Fragezeichen zu finden, die
dem ActionListener hinzugefügt werden und dort dann mit Hilfe der Klasse
Menuefenster.java ein Hilfefenster erstellt wird.
Auf dem dritten Tab existiert auch ein Button „Sortiere…“ der dem ActionListener
hinzugefügt wird. Dieser startet dann mit Hilfe der Klasse Tab3.java die
Berechnungen.
Der Button „Felder leeren“ wird ebenfalls dem ActionListener hinzugefügt, der die
4 zur Verfügung stehenden Textfelder mit leeren Strings füllt und so für den
Nutzer „leert“.
Auch der „Beenden“ Button wird dem ActionListener hinzugefügt, der dann das
gesamte Programm mit einem System.exit(0) beendet.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 23 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
3.3.4 Saeule (LM)
Abbildung 18 - Klasse Saeule
Die Klasse Saeule.java ist für das Zeichnen der einzelnen Säulen auf dem Tab1
zuständig. Jede Säule stellt ein Objekt der Klasse Saeule.java dar.
Beim erstellen eines Objektes dieser Klasse, wird die Methode paintComponent()
durch das System aufgerufen, in der ein Objekt vom Typ Graphics übergeben
wird, mit der eine Säulen gezeichnet wird.
Beim Starten des Programms erzeugt die Klasse Hauptfenster.java die Objekte
der Klasse Saeulen.java in der Methode zeichneFeld(). Nachdem ein Objekt
erstellt wurde, wird die Methode zeichneSaeule() aufgerufen, um die Parameter
für die Größe und Farbe dieser entsprechenden Zahl zu setzen. Dies wird so
lange wiederholt, bis alle 15 Zufallszahlen gezeichnet wurden.
Um die visuelle Sortierung der Säulen darzustellen, wird die Methode
rahmenZeichnen(boolean x) aufgerufen. Sie bestimmt, ob ein schwarzer Rahmen
um die Säule gezeichnet wird oder nicht, indem eine boolean-Variable auf true
oder false gesetzt wird.
Soll eine Säule gelöscht werden, z.B. bei dem Tauschvorgang, werden von der
Methode loescheSaeule() der Klasse Hauptfenster.java Parameter mit den
Werten 0 übergeben, sodass eine nicht-sichtbare Säule gezeichnet wird.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 24 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
3.4 Programmierung des Paketes Berechnungen
(LW)
3.4.1 Tab2
Abbildung 19 - Klasse Tab2
Der zweite Tab dient zur zeitlichen Berechnung einer Sortierung. Die Klasse
besteht aus einer Methode, die für die gesamte Berechnung zuständig ist. Hierbei
wird zunächst die vom Nutzer eingegebene Menge ausgelesen und überprüft,
dass heißt, ob die Zahl zwischen 1 und 200.000 ist und ob es sich eventuell um
keine Zahl handelt. Danach wird ein Feld mit der Länge der ausgelesenen Menge
erstellt. Dieses Feld wird mit Hilfe der Klasse RandomArray.java mit Zufallszahlen
gefüllt. Im nächsten Schritt wird durch eine if-Anweisung unterschieden, um
welchen Sortieralgorithmus es sich handelt.
Danach wird das Feld mit Zufallszahlen an die jeweilige Methode der Algorithmen
übergeben
(startBubbleOhneVis(),
startInsertOhneVis()
und
startSelectionOhneVis() ). Nachdem die Sortierung durchgeführt wurde, wird die
Dauer der Sortierung durch die Methode gibDauer() der jeweiligen
Sortierverfahren abgerufen und mit Hilfe der Hauptfenster-Instanz durch die
Methode setzeZeit2Tab() in das Feld „Dauer der Sortierung in Millisekunden“
geschrieben.
Danach werden noch mit Hilfe der Methoden gibAnzVergleich() und
gibAnzAustausch() der jeweiligen Sortierverfahren die Anzahl, wie oft zwei
Elemente bei der Sortierung miteinander verglichen und getauscht wurden,
gesichert. Mit Hilfe der Hauptfenster-Instanz werden diese Zahlen durch die
Methoden setzeAnzVergleich() und setzeAnzAustausch() in die jeweiligen Felder
der GUI geschrieben.
Jeder mögliche Fehler der entstehen kann, wird abgefangen und dieser wird dem
Nutzer mit einem kleinen Popup-Fenster kenntlich gemacht.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 25 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
3.4.2 Tab3
Abbildung 20 - Klasse Tab3
Der dritte Tab dient zunächst dem zeitlichen Vergleich der drei Sortierverfahren.
Der Aufruf der Methode erstelleBerechnung() erfolgt durch den ActionListener in
der Klasse Hauptfenster.java, wenn der Nutzer den Button „Sortiere…“ auf dem
dritten Tab gedrückt hat. Der Übergabewert Nachricht entspricht hierbei der
Eingabe, die der Nutzer getätigt hat, dass bedeutet, die Menge, wie groß das
Feld an Zufallszahlen werden soll.
Der erste Schritt ist es, zu schauen, ob es sich hierbei um eine Zahl handelt und
ob diese Zahl zwischen 1 und 200.000 liegt. Wenn mindestens eines davon nicht
der Fall ist, wird ein Popup-Fenster geöffnet, welches dem Nutzer sagt, was er
falsch gemacht hat und wie es richtig sein muss.
Danach wird mit Hilfe der Klasse RandomArray.java das Feld mit Zufallszahlen
erzeugt und danach in drei verschiedene int-Arrays, eines für jeden
Sortieralgorithmus, gespeichert.
Im nächsten Schritt werden nun die Sortierungen mit Hilfe der jeweiligen
Sortierklassen (BubbleSort.java, InsertionSort.java und SelectionSort.java)
durchgegangen und jeweils die Dauer der jeweiligen Sortierung geholt. Diese
Angaben werden jeweils mit Hilfe der speziellen Methoden der Hauptklasse in die
Textfelder geschrieben.
3.5 Programmierung des Paketes Steuerung
(LW, LM)
3.5.1 MAIN
Abbildung 21 - Klasse MAIN
Die MAIN-Klasse enthält die Variable Anzeigedauer, mit der festgelegt wird, wie
lange das Startfenster angezeigt werden soll. Standardgemäß haben wir diesen
Wert auf 5 Sekunden gesetzt, sodass der Nutzer genug Zeit hat, sich das
Startfenster anzuschauen. Wie man dem Namen der Klasse schon entnehmen
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 26 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
kann, enthält diese die main-Methode. Dort wird nun das Startfenster mit der
gegebenen Dauer gestartet.
3.6 Programmierung des Paketes Utilities
Diese Klassen sind Hilfsklassen und wurden als static definiert, sodass keine
Objekte mehr erzeugt werden müssen, sondern ein direkter Zugriff möglich ist.
3.6.1 Erklaerungen (LW)
Abbildung 22 - Klasse Erklaerungen
Diese Klasse wird von den Klassen der Sortierverfahren aufgerufen und somit
genutzt.
Die Methode überprüft zunächst mit einer if-Anweisung, um welches
Sortierverfahren es sich handelt. Im nächsten Schritt wird durch eine
switch/case-Abfrage überprüft, um welchen Wert es sich bei dem Übergabewert
parameter handelt. Je nachdem wird der Variable erkl ein String zugewiesen.
Dieser wird am Ende als Returnwert zurückgegeben.
Diese Strings entsprechen den jeweiligen Erklärungen auf dem ersten Tab,
parallel zur Sortierung.
3.6.2 GeschwindigkeitsEinstellung (LW)
Abbildung 23 - Klasse GeschwindigkeitsEinstellungen
Wenn der Nutzer auf dem Hauptfenster den Slider nutzt, um die Geschwindigkeit
der Sortierung einzustellen, übergibt die Klasse Hauptfenster.java diesen Wert an
diese Hilfsklasse.
Die Klasse GeschwindigkeitsEinstellung.java ermittelt nun durch eine ifAnweisung, um welchen Wert (zwischen 0 und 100) es sich bei dem
Übergabewert handelt. Je nachdem wird nun die Variable „schlafen“ gesetzt.
Hierbei ist anzumerken, dass 0 einer Geschwindigkeit von sehr schnell und 100
einer Geschwindigkeit von sehr langsam entspricht.
Wenn nun die Sortierung beginnt, holt sich der jeweilige Sortieralgorithmus den
Wert der Variable „schlafen“ mit Hilfe der Methode gibSchlafen().
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 27 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
3.6.3 Menuefenster (LM, LW)
Abbildung 24 - Klasse MenueFenster
Ein Objekt dieser Klasse wird jedes Mal erzeugt, sobald der Anwender in der
Menüleiste einen der Unterpunkte von Algorithmus oder Hilfe auswählt. Durch
den Aufruf der Methode erstelleHilfeFrame(String buttonFunk) der Klasse
Menuefenster.java wird ein JFrame mit einem JTextArea erzeugt, in dem ein
entsprechender Text geschrieben wird. Der Parameter buttonFunk gibt an,
welcher Text für das Fenster benötigt wird.
3.6.4 RandomArray (LM, LW)
Abbildung 25 - Klasse RandomArray
Diese Klasse wird generell genutzt, um ein Array mit einer gegebenen Größe mit
Zufallszahlen zu füllen. Hierbei nehmen die Klasse Hauptfenster.java (Tab1),
Tab2.java und Tab3.java diese Dienste in Anspruch.
Zum einen gibt es hier die Methode erzeugeRandomArray(), die mit der
übergebenen Menge auch dementsprechend viele Zufallszahlen erzeugt. Diese
Zahl ergibt sich je nach der Eingabe des Nutzers auf Tab2 oder Tab3. Das
bedeutet, dass das Feld zwischen 1 und 200.000 Elementen groß ist.
Für die graphische Darstellung der Sortierung war es nötig, eine zweite Methode
einzuführen, die ein Array mit Zufallszahlen füllt, die Anzahl der Elemente ist hier
aber auf den Wert 10 (0-9) beschränkt, da dadurch die Visualisierung vereinfacht
wurde.
Wir haben uns dazu entschieden, zwei Methoden zu erstellen, die ein Feld mit
Zufallszahlen erzeugt, da wir der Meinung sind, dass die Berechnungen bei Tab2
und Tab3 verfälscht werden, wenn man hier nur Zahlen zwischen 0 und 9 nimmt.
Andersrum wäre es ein erheblicher Aufwand gewesen, die Visualisierung der
Sortierung nicht dem festen Wert 10 anzupassen.
Die Methoden gibRandomArray() und getNumbers() geben jeweils das Array
bestehend aus Zufallszahlen an die jeweiligen Klassen zurück.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 28 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
3.6.5 Zeitmessung (LW)
Abbildung 26 - Klasse Zeitmessung
Diese Klasse steht den drei Klassen des Paketes „Algorithmen“ zur Verfügung
(BubbleSort.java, InsertionSort.java und SelectionSort.java). Hierbei wird mit
der Methode messeZeit() jeweils durch den Algorithmus vor und nach der
Sortierung die Zeit gemessen. Im nächsten Schritt übergibt der jeweilige
Sortieralgorithmus die Anfangszeit und die Endzeit an die Methode errechneZeit()
und diese ermittelt dann die Dauer und gibt diese zurück.
4. eingesetzte Werkzeuge und Basisliteratur
(LW, LM)
Das gesamte Projekt wurde mit Hilfe von Eclipse SDK Version 3.3.1.1
programmiert und umgesetzt.
Des Weiteren wurden folgende Programme genutzt:
OpenOffice Version 2.3
zur Erstellung der Dokumentation und Präsentation
Adobe Photoshop Version 7.0
zur Erstellung von Grafiken
Visual Paradigm Version 6.1
zur Erstellung von UML-Klassendiagrammen
Zusammenfassend wurden in den meisten Fällen folgende Hilfsmittel genutzt:
Java von Kopf bis Fuß
von Kathy Sierra & Bert Bates
Galileo Computing:: Java ist auch eine Insel
http://www.galileocomputing.de/openbook/javainsel6/
JavaTM 2 Platform Standard Edition 5.0
http://java.sun.com/j2se/1.5.0/docs/api/
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 29 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
5. Darstellung relevanter Probleme und
deren Lösung (LM, LW)
Im Endeffekt gab es bei der Erstellung des Programms „sorty“ keine größeren
Probleme, die überhaupt nicht gelöst werden konnten.
Ein Problem stellte sich bei der Erstellung eines Timers. Hierbei wollten wir bei
der Sortierung auf dem Tab2 und Tab3 die Möglichkeit haben, dass während der
Sortierung die Zeit hoch läuft, dass heißt, dass man sieht, dass die Sortierung
am Laufen ist und nicht nur am Ende die Gesamtdauer angezeigt wird. Zusätzlich
wollten wir eine kleine Animation, eine tickende, laufende Uhr, während der
Sortierung anzeigen. Jedoch hatten wir hiermit einige Probleme, da die gesamte
Sortierung innerhalb einer inneren Klasse, genauer gesagt eines ActionListeneres
abspielt. Aus uns nicht bekannten Gründen konnten wir so eine selbst
geschriebene Methode nicht innerhalb dieser Methode starten. Außerhalb war
dies kein Problem. Genau dasselbe passierte auch mit der Animation. Nach
etlichen Versuchen und neuen Ideen haben wir im Endeffekt leider keine Lösung
gefunden und da diese Punkte nur als Extras anzusehen sind, haben wir uns
dazu entschlossen, den Timer und die Animation nicht mit einzubauen.
Im Folgenden sind nun noch vier Probleme aufgelistet, an denen wir viel Zeit
investiert und am Ende auch eine Lösung gefunden haben.
1. Problem – Highlighter (LM)
Um in dem JtextArea pseudoCode die einzelnen Zeilen zu markieren, wurde
zuerst die Methode select() genutzt, was auch funktioniert hat. Jedoch war hier
ein sehr großer Nachteil, das beim anklicken des Fenster oder der Buttons die
Zeile wieder deselektiert wurde. Da wir mittels des Pause-Buttons eine
Möglichkeit bieten wollten, die einzelnen Komponenten genauer zu betrachten,
war dies ein Problem, da man evtl. nicht mehr nachvollziehen konnte, in welcher
Zeile der Algorithmus sich gerade befindet.
Um dieses Problem zu lösen, haben wir uns für den Einsatz eines Highlighters
entschlossen.
Ein Highlighter ermöglicht es einem, bestimmte Bereiche in einer bestimmten
Farbe zu markieren, wie die Methode select(), nur mit dem Vorteil, dass die
Zeilen auf jeden Fall markiert bleiben.
Der Highlighter wurde folgendermaßen realisiert:
private Highlighter highlight = pseudoCode.getHighlighter();
public void zeileMarkieren(int zeilenAnfang, int zeilenEnde){
highlight.removeAllHighlights();
try {
start = pseudoCode.getLineStartOffset(zeilenAnfang);
ende = pseudoCode.getLineEndOffset(zeilenEnde);
highlight.addHighlight(start, ende,
DefaultHighlighter.DefaultPainter);
} catch (Exception e1) {}
pseudoCode.repaint();
}
Bei dem Aufruf der Methode zeileMarkieren() wird der Zeilenanfang und der
Zeilenende der Zeile übergeben, die markiert werden soll. Der Aufruf der
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 30 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
Methode addHighlight(start, ende, DefaultHighlighter.DefaultPainter) markiert die
Zeile in der Farbe, die Standardmäßig eingestellt ist.
2. Problem – RandomArray (LM)
Für die visuelle Darstellung des Sortiervorgangs haben wir eine Zahlenmenge der
Größe 15 festgelegt mit Zahlen von 0 bis 9. Dementsprechend wurden Konstante
Werte für die Größe und Farbe der 10 Möglichen Zahlen festgelegt. Da wir aber
bei der zeitlichen Berechnung zusätzlich noch größere Zahlen verwenden wollten,
haben wir uns dazu entschlossen, zwei verschiedene Methoden für die
Zufallszahlenerzeugung zu erstellen.
Die Methode erzeugeRandomArray() erzeugt ein Feld mit Zufallszahlen zwischen
1 und der vom Anwender eingegebenen Menge. Diese Methode wird für die
zeitliche Berechnung und den zeitlichen Vergleich verwendet.
Die Methode setzeNummern() erzeugt ein Feld mit Zufallszahlen zwischen 0 und
9, die für die visuelle Darstellung genutzt wird.
3. Problem – getInstance() (LW)
Das Programm “sorty” besteht insgesamt aus 15 Klassen. Hierbei kommt es oft
vor, dass einige Klassen Zugriff auf die wichtigste Klasse, die Hauptfenster.java,
benötigen.
Für den Fall, dass es notwendig war, wurde immer beim Methoden- oder
Konstruktor-Aufruf das Objekt der Klasse Hauptfenster mit übergeben.
Zum Beispiel startet man das Hauptfenster das erste Mal, indem man bei dem
Auswahlfenster auf einen Button klickt. Wenn man nun im Hauptfenster die
Möglichkeit „Zurueck zur Auswahl“ nutzt, gelangt man wieder zu dieser Auswahl.
Bisher haben wir an dieser Stelle immer ein neues Objekt der Klasse
Hauptfenster.java erzeugt.
Da dies aber irgendwann zu Problemen und zur Unübersichtlichkeit führt, haben
wir lange nach einer Lösung gesucht, wie man dieses Problem in den Griff
bekommt.
Letztendlich haben wir folgenden Codeausschnitt in die Klasse Hauptfenster.java
eingefügt:
private static Hauptfenster HAUPTFENSTER;
public static Hauptfenster getInstance (String algorithmus)
{
if (HAUPTFENSTER == null)
{
HAUPTFENSTER = new Hauptfenster (algorithmus);
}
return HAUPTFENSTER;
}
Da die Methode getInstance() static ist, hat man aus dem gesamten Programm
Zugriff auf diese Methode. Beim Aufruf wird zunächst überprüft, ob schon ein
Objekt der Klasse Hauptfenster erstellt wurde, wenn dies nicht der Fall ist, wird
ein neues Objekt erzeugt. Das passiert bei dem Aufruf von der Klasse
AuswahlAlgorithmen.java. Ab diesem Punkt existiert ein Objekt und die Variable
ist nicht mehr null, deshalb wird dann das Objekt von Hauptfenster
zurückgegeben.
Mit dieser Methode ist es sehr einfach und elegant, auf das Hauptfenster und
deren Methoden zuzugreifen, ohne das Objekt mit übergeben oder erstellen zu
müssen.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 31 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
4. Problem – Array clonen (LW)
Dieses Problem trat bei dem dritten Tab (Vergleich der Algorithmen) auf. Hierbei
wird ein Array erzeugt und dieses Array soll von allen Sortierverfahren sortiert
werden.
Hierzu erzeugen wir zunächst mit Hilfe der Klasse RandomArray.java das Feld
bestehend aus Zufallszahlen. Im Folgenden ist eine Variante zu sehen, die wir
ausprobiert haben.
random.erzeugeRandomArray (menge);
intArrayBubble = random.gibRandomArray ();
intArrayInsertion = intArrayBubble;
intArraySelection = intArrayBubble;
Danach haben wird das Array jeweils für die Algorithmen abgespeichert, sodass
auch jeder das gleiche Array sortiert und dann beginnt die Sortierung. Jedoch
hatten wir immer wieder das Problem, dass bei dem 2. und 3. Array immer schon
sortierte Arrays ankamen, dass heißt, die Dauer auch auf 0 Millisekunden lag.
Wir konnten uns nicht erklären, warum die Sortierung des ersten Arrays
funktionierte und dann die anderen beiden Arrays, die ja separat abgespeichert
waren, schon die sortierte Menge ankam.
Nach langem Suchen und Probieren konnte uns dann ein Kommilitone helfen.
Dadurch, dass wir das Array, wie unter Anderem im oberen Beispiel, einfach
gleichgesetzt haben, sieht Java das immer noch als ein Array an und so werden
die Änderungen in dem einen Array in den anderen Arrays mitgespeichert. Im
Endeffekt, sieht also die Lösung wie folgt aus:
random.erzeugeRandomArray (menge);
intArrayBubble = random.gibRandomArray ();
intArrayInsertion = intArrayBubble.clone ();
intArraySelection = intArrayBubble.clone ();
Hier wird nun das eine Array zweimal geklont, so wirken sich die Änderungen an
dem einen nicht mehr auf die anderen beiden aus.
6. Darstellung des Aufwandes (LW, LM)
Für den reinen Programmieraufwand lässt sich zusammenfassend sagen, dass
wir ungefähr 65 Stunden pro Person in das Projekt gesteckt haben. Hierbei
wurde von beiden Personen ungefähr die gleiche Zeit hineingesteckt.
Von den 65 Stunden wurden ca. 40 Stunden für die Programmierung der
Basisfunktionen, dass heißt für die Ziele im Projektantrag, investiert.
Die restlichen 25 Stunden wurden dann für die Optimierung und
Benutzerfreundlichkeit genutzt.
Das Sammeln von Informationen und das Lösen von Problemen ist in den 65
Stunden enthalten.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 32 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
7. Fazit (LM, LW)
Gesamt betrachtet lässt sich sagen, dass wir mit unserem Projekt, dem
Programm sorty, sehr zufrieden sind.
Die im Projektantrag gestellten Ziele wurden alle erreicht. Die wichtigsten
werden im Folgenden nochmals kurz dargestellt:
Umsetzung der Sortieralgorithmen Bubblesort, Insertionsort
Selectionsort
Visualisierung
o Graphische Darstellung anhand von Säulen
o Ablauf des Pseudocodes parallel zur Sortierung
o Darstellung der Umgebung und Tabs
o Berechnung der Dauer der Sortieralgorithmen (Tab2)
und
Darüber hinaus haben wir die optionalen Komponenten Start-/Stop-Funktion bei
der visuellen Sortierung und eine zusätzliche schriftliche Erklärung parallel zum
Sortiervorgang umgesetzt. Zur Umsetzung dieser Punkte haben wir uns
entschlossen, um unser Projekt zu optimieren und benutzerfreundlicher zu
gestalten.
Die optionale Komponente Animation und die Umsetzung mittels Java3d haben
wir aus Zeitgründen nicht umsetzen können.
Während der Entwicklung unseres Projektes kamen wir auf die Idee, eine
zusätzliche Funktion einzuführen. Wir waren der Meinung, es wäre interessant
einen Vergleich zwischen den einzelnen Sortierverfahren zur Verfügung zu
stellen. Somit haben wir einen zusätzlichen Tab eingeführt, der für diesen
zeitlichen Vergleich zuständig ist.
Außerdem haben wir zusätzlich die Möglichkeit eingebaut, dass der Nutzer vor
der Sortierung die Geschwindigkeit der visuellen Sortierung einstellen kann.
Um die Benutzerfreundlichkeit und auch die Funktionalität unseres Programms zu
Testen, haben wir an verschiedenen Meilensteinen unseres Projektes Studierende
und auch Nicht-Studierende ohne Hilfe unser Programm testen lassen.
Hierbei bekamen wir gerade am abschließenden Stand unseres Programms sehr
positive Resonanz. Die Testpersonen gaben an, dass das Programm generell sehr
einfach zu verstehen ist, eine klare Strukturierung vorliegt und viele Hilfen
geboten sind.
Verbesserungsvorschläge
Neue Randomzahlen
Wird bei dem Sortiervorgang der Button neue Randomzahlen gedrückt werden
während der aktuellen Sortierung neue Zahlen erzeugt und auch in das Feld
gemalt. Das Programm sortiert ungestört weiter.
Sortiere Button
Wird während dem Sortiervorgang der Button Sortiere geklickt, wird ein neuer
Thread gestartet. Der alte Thread ist dann nicht mehr ansprechbar, d.h. er kann
nicht pausiert oder gestoppt werden.
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 33 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
Stop-Funktion für Tab2 und Tab3
Auf dem Tab 2 und Tab 3 gibt es keine Möglichkeit, den Sortiervorgang
abzubrechen. Dies wäre von Vorteil, wenn man eine besonders große Zahl
eingegeben hat und nicht bis zum Ende warten möchte.
8. Quellen
[1] Wikipedia – Die freie Enzyklopädie
http://www.wikipedia.de
[2] Herr Prof. Dr. Ehrenberger
Skript: Algorithmen und Datenstrukturen
[3] Mycsresource.net – Sorting Algorithms
http://www.mycsresource.net/articles/programming/sorting_algos/bubble
sort
9. Anhang
Bild zum Punkt 3.3.3 Hauptfenster
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 34 von 35
Lehrveranstaltung „Graphik-Programmierung“
Visualisierung von Sortieralgorithmen
Erstellt von Lisa McLaughlin und Lisa Wäldchen
Seite 35 von 35

Documentos relacionados