Facharbeit über Sortier- und Suchalgorithmen - Index of
Facharbeit über Sortier- und Suchalgorithmen - Index of
Facharbeit über Sortier- und Suchalgorithmen - Index of
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Kardinal-Frings-Gymnasium<br />
Elsa-Brandström-Straße 71-91<br />
53227 Bonn-Beuel<br />
<strong>Facharbeit</strong><br />
im Gr<strong>und</strong>kurs Informatik 12.2<br />
Such- <strong>und</strong> <strong>Sortier</strong>algorithmen<br />
Verfasser: Cornelius Herget<br />
Fachlehrer: Dr. Niecknig<br />
Abgabetermin: 31.3.2004<br />
Abgabe erfolgt:
Inhaltsverzeichnis<br />
1. Inhaltsverzeichnis 1<br />
2. Einleitung 2<br />
3. Was ist ein Algorithmus? Herkunft des Wortes Algorithmus 3<br />
4. Verschiedene <strong>Sortier</strong>algorithmen 4<br />
4.1 <strong>Sortier</strong>algorithmen 4<br />
4.1.1 BubbleSort 4<br />
4.1.2 SelectionSort 5<br />
4.1.3 QuickSort 6<br />
4.2 Suchtypen 7<br />
4.2.1 Lineare Suche 7<br />
4.2.2 Binäre Suche 8<br />
5. Effektivität der Algorithmen 9<br />
6. Welche Voraussetzungen müssen neue Algorithmen erfüllen? 12<br />
7. Anhang 13<br />
7.1 Literaturverzeichnis 13<br />
7.2 Verzeichnis der Abbildungen 13<br />
7.3 Algorithmen für Delphi 14<br />
7.4 Erklärung zur selbstständigen Arbeit 16<br />
7.5 Benutzte Internetseiten<br />
2
2. Einleitung<br />
Diese Arbeit beschäftigt sich mit einigen <strong>Sortier</strong>- <strong>und</strong> <strong>Suchalgorithmen</strong>, ihrer<br />
Funktion <strong>und</strong> Verwendung. Das Suchen von Informationen ist eine seit Existenz der<br />
Menschheit vorhandene Aufgabe des Menschen, lediglich die Art von Informationen<br />
hat sich geändert. Während Menschen vor X-tausend Jahren sich beim Suchen<br />
größtenteils auf <strong>über</strong>lebensnotwendige Dinge beschränkt haben existiert heutzutage<br />
die Möglichkeit Informationen binnen Sek<strong>und</strong>en im Internet zu suchen <strong>und</strong><br />
abzurufen.<br />
Bevor jedoch eine Information gezielt gesucht werden kann muss sie einer gewissen<br />
Ordnung unterliegen. Diese Ordnung wurde anhand vom bestimmten Kriterien<br />
erstellt.<br />
Im ersten Teil dieser <strong>Facharbeit</strong> findet eine Abgrenzung des Begriffes Algorithmus<br />
<strong>und</strong> eine Klärung hinsichtlich der Bedeutung <strong>und</strong> Herkunft dieses Begriffes statt.<br />
Nach Abgrenzung des Begriffes werden die erarbeiteten Gr<strong>und</strong>lagen anhand<br />
mehrere Algorithmen geklärt. Aufgr<strong>und</strong> der vorhandenen Vielfalt an Algorithmen, von<br />
denen viele äußert schwierig <strong>und</strong> stark spezialisiert sind, werden in dieser <strong>Facharbeit</strong><br />
2 einfache <strong>Sortier</strong>algorithmen (BubbleSort, SelectionSort) <strong>und</strong> ein schneller<br />
Suchalgorithmus (QuickSort) vorgestellt. Neben den <strong>Suchalgorithmen</strong> werden die<br />
beiden Suchformen Binäre Suche <strong>und</strong> Lineare Suche erläutert <strong>und</strong> im zweiten Teil<br />
dieser Arbeit objektiv auf ihre Effizienz hin untersucht.<br />
Im letzten Teil dieser <strong>Facharbeit</strong> wurden schließlich Bedingungen <strong>und</strong><br />
Anforderungen erarbeitet, die an neue Algorithmen hinsichtlich der Kriterien aus dem<br />
zweiten Teil dieser Arbeit gestellt werden müssen.<br />
3
3. Was ist ein Algorithmus? – Herkunft des Wortes Algorithmus<br />
Das Wort Algorithmus 1 geht auf einen arabischen Mathematiker zurück. Der aus<br />
dem arabischen Raum stammende Muhammed Ibn Musa Al-Khwarizimi (*um 780 †<br />
zwischen 835 <strong>und</strong> 850), welcher mehrere mathematische Werke veröffentlicht hat<br />
prägte mit seinem Namen die heutige Bedeutung des Begriffes Algorithmus <strong>und</strong><br />
setzte die Gr<strong>und</strong>lagen der heutigen Algebra. Die lateinische Fassung eines seiner<br />
Werke beginnt mit den Worten „Dixit Algorithmi“ („Nach Algorithmus“). Die<br />
Bedeutung des Wortes ‚Algorism’ wandelte sich von dem Umgang mit arabischen<br />
Zahlen hin zu Prozeduren, mit denen man verschiedenste komplexe Probleme lösen<br />
kann.<br />
„Ein Algorithmus ist eine Handlungsanweisung die bei genauer Anwendung nach<br />
einer endlichen Anzahl von Schritten zum gewünschten Ergebnis führt“ 2<br />
Der Algorithmus als Rechenvorschrift basiert auf zwei Gr<strong>und</strong>elementen: der<br />
Rechenanweisung, die angibt welche Aktionen ausgeführt werden sollen, <strong>und</strong> dem<br />
bedingten Sprung, der angibt, wie bei Eintritt eines bestimmten Zustandes oder einer<br />
eintretenden Bedingung verfahren werden soll.<br />
Um <strong>über</strong> die charakteristischen Eigenschaften von Algorithmen etwas sagen zu<br />
können betrachtet man am besten den Aufbau der ersten Algorithmen.<br />
I. Diskretheit – Jeder Algorithmus besteht aus einer Abfolge von n Schritten<br />
II. Determiniertheit – Das Ergebnis bei der Verwendung von Algorithmen ist bei<br />
gleicher Anfangsposition immer das Gleiche<br />
III. Eindeutigkeit – Nach jedem Schritt ist klar definiert, wie fortgefahren werden<br />
soll<br />
IV. Endlichkeit – Der Algorithmus endet nach endlich vielen Schritten<br />
Betrachtet man nun diese Definition von Algorithmen, so verkennt man <strong>of</strong>t die<br />
Einsatzgebiete von algorithmischen, mathematischen <strong>und</strong> naturwissenschaftlichen<br />
Gr<strong>und</strong>lagen in unserem alltäglichen Leben. Vom Mobiltelefon <strong>über</strong> die Mikrowelle hin<br />
1 nach Schreiber, Alfred „Was ist ein Algorithmus“ (2000)<br />
2 von Dijkstra, Edsger W.; Feijen ,W. H. J.: Methodik des Programmierens, S.5<br />
4
zur Ampel an der Straßenkreuzung bilden mathematisch algorithmische Schaltungen<br />
einen nicht unbedeutenden Teil unseres Alltags.<br />
4. Verschiedene <strong>Sortier</strong>algorithmen<br />
4.1 <strong>Sortier</strong>algorithmen<br />
4.1.1 BubbleSort<br />
BubbleSort ist ein recht simpler <strong>Sortier</strong>algorithmus, mit dem sich zum Beispiel eine<br />
Liste von Zahlen oder Buchstaben sortieren lässt. Der eigentliche <strong>Sortier</strong>vorgang<br />
erfolgt durch eine Vertauschung von einzelnen Elementen bei Eintritt einer<br />
Bedingung. Das Array (Datenfeld) wird in mehreren Durchgängen von links nach<br />
rechts durchlaufen <strong>und</strong> jeweils zwei nebeneinander liegende Elemente verglichen.<br />
„{Schleife <strong>über</strong> Durchlauf = 1…N-1<br />
Schleife <strong>über</strong> Position = 1…N-Durchlauf<br />
Schleife Ende<br />
Schleife Ende}“ 3<br />
Falls x[Position] > x[Position +1]<br />
Dann vertausche X[Position] <strong>und</strong> x[Position +1]<br />
Der Algorithmus besteht wie beschrieben aus zwei Schleifen <strong>und</strong> einer if-Bedingung.<br />
Die erste Schleife ist für die Anzahl der Durchläufe im Array zuständig. Die zweite<br />
Schleife läuft innerhalb des zu sortierenden Arrays vom ersten bis zum letzten<br />
Element <strong>und</strong> wird nur dann unterbrochen, wenn ein zuvor eingelesenes Element<br />
größer als das darauf folgende ist. Tritt diese Bedingung ein, so werden zunächst die<br />
beiden Elemente vertauscht bevor Fortgefahren wird.<br />
Abbildung 1: BubbleSort: Der erste Durchgang 4<br />
3 entnommen aus Wikipedia ‚BubbleSort“<br />
4 entnommen aus Gumm, H.P; Sommer, M: Einführung in die Informatik, S.262<br />
5
Abb. 2: BubbleSort: Verlauf des Algorithmus 5<br />
Der <strong>Sortier</strong>vorgang endet bei diesem Beispiel bereits nach dem zehnten Durchlauf.<br />
Dies liegt daran, dass die Anzahl der unsortierten Elemente mit zunehmendem<br />
Fortschritt des <strong>Sortier</strong>verfahrens geringer wird. Im schlechtesten Fall beträgt die<br />
Anzahl der Durchläufe des Algorithmus (N-1)-Durchläufe (N: Anzahl der Elemente<br />
des Feldes).<br />
4.1.2 SelectionSort<br />
SelectionSort 6 arbeitet nach dem Prinzip, das kleinste bzw. größte Element eines<br />
Feldes zu suchen, um dieses dann mit dem ersten/letzten Element zu vertauschen.<br />
Der Algorithmus selbst besteht aus einer for-Schleife, einer Vergleichsprozedur <strong>und</strong><br />
einer Prozedur, die für das Vertauschen der beiden Elemente zuständig ist.<br />
Dieser Vergleichs- , Vertauschvorgang wird bis zum vorletzten Element fortgeführt.<br />
1 2 3 4 5 6<br />
5 entnommen aus Gumm, H.P; Sommer, M: Einführung in die Informatik, S.263<br />
6 erläutert nach Wikipedia ‚SelectionSort’<br />
6
G D Z F L A Ausgangsposition (unsortiert)<br />
A D Z F L G Minimum A wurde mit G getauscht<br />
A D Z F L G Z wird mit F getauscht<br />
A D F Z L G Z wird mit G getauscht<br />
A D F G L Z Das Array ist fertig sortiert!<br />
A D F G L Z<br />
Während die äußere Schleife das Array (N-1) mal durchläuft, muss die innere<br />
Schleife (n-k) Vergleiche durchführen, wobei k die aktuelle Position nach dem zuletzt<br />
sortierten Element ist.<br />
4.1.3 QuickSort<br />
QuickSort 7 ist ein schneller rekursiver <strong>Sortier</strong>algorithmus, der 1960 von C. Antony R.<br />
Hoare entwickelt wurde. Der Algorithmus selbst arbeitet nach dem Prinzip „Teile <strong>und</strong><br />
Herrsche“ (eng. ‚Divide and conquer’).<br />
Der Algorithmus sucht aus einem unsortierten Feld ein so genanntes Pivoelement,<br />
das die Mitte zweier Subarrays bildet. Das zu sortierende Feld ist nun in zwei<br />
Subarrays geteilt. Auf der einen Seite der beiden Felder werden später alle<br />
Elemente, die kleiner als das Pivoelement sind, abgelegt <strong>und</strong> auf der anderen alle,<br />
die größer sind. Nun erfolgen die eigentlichen Such- <strong>und</strong> <strong>Sortier</strong>prozesse. Dazu<br />
werden jeweils von unten <strong>und</strong> oben beginnend Elemente gesucht, die größer bzw.<br />
kleiner als das Pivoelement sind. Wurden nun zwei Elemente gef<strong>und</strong>en, die diese<br />
Bedingung erfüllen, so werden diese zwei Elemente vom Algorithmus getauscht.<br />
Dieser Vorgang setzt sich so lange fort, bis die beiden Such/Vergleichsschleifen die<br />
Mitte des Feldes, also das Pivoelement erreicht haben. Nachdem dieser Zustand<br />
erreicht wurde, unterteilt der Algorithmus die aktuell vorhandenen zwei Felder erneut<br />
<strong>und</strong> führt das <strong>Sortier</strong>verfahren in den nun 4 Subarrays wieder durch. Diese<br />
Einteilung des Arrays erfolgt so lange, bis alle Elemente sortiert sind <strong>und</strong> die<br />
Unterteilung der Felder eine Feldgröße von einem Element pro Array ergibt.<br />
7 erarbeitet <strong>und</strong> zusammengestellt aus Wikipedia ‚QuickSort’ <strong>und</strong><br />
Gumm, H.P; Sommer, M.: Einführung in die Informatik, S. 271<br />
7
Der ständige Teilvorgang, den QuickSort im Gegensatz zu den anderen Algorithmen<br />
durchführt, führt einen quadratischen Anstieg der Pivoelemente <strong>und</strong> der Subarrays<br />
mit sich.<br />
Beispiel 8 für den <strong>Sortier</strong>algorithmus QuickSort:<br />
„Es soll ein Array mit dem Inhalt [44|55|12|42|94|18|06|67] mittels QuickSort sortiert<br />
werden. Als Pivoelement (fett gedruckt) wird dabei immer das Element in der Mitte<br />
des (Teil-) Arrays gewählt.“<br />
44 55 12 42 94 18 06 67 Pivoelement bestimmt<br />
44 55 12 42 94 18 06 67 44 größer als PE, 6 kleiner -> vertausche<br />
06 55 12 42 94 18 44 67 55>42 <strong>und</strong> 18 vertausche<br />
06 18 12 (42) 94 55 44 67 Neue PE 18 <strong>und</strong> 55<br />
06 18 12 42 94 55 44 67 12= 18, 4444<br />
06 12 (18 42 44 55) 94 67 PE auswählen <strong>und</strong> 94 mit 67 tauschen<br />
(06 12 18 42 44 55 67 94) <strong>Sortier</strong>te Menge<br />
4.2 Suchtypen<br />
4.2.1 Lineare Suche<br />
Der Algorithmus der linearen Suche 9 ist auch unter dem Namen sequenzielle Suche<br />
bekannt. Die Aufgabe des Algorithmus ist es, ein Element x in einer Liste mit n-<br />
Elementen zu suchen <strong>und</strong> die Position auszugeben, an der das Element x gef<strong>und</strong>en<br />
wurde.<br />
Dabei werden die Elemente der Liste vom ersten bis zum letzten durchlaufen <strong>und</strong><br />
jedes mal erfolgt ein Vergleich mit dem zu suchenden Element. Sind die beiden<br />
Elemente identisch <strong>und</strong> die Vergleichsabfrage liefert den Wert ‚true’, so wurde das<br />
Element in der Liste gef<strong>und</strong>en. Beim Algorithmus wächst der Suchaufwand linear mit<br />
der Anzahl der Elemente in der Liste an.<br />
Je nach Suchtyp (d.h., fortlaufende Suche oder Abbruch bei Sucherfolg) kann die<br />
Suche bereits nach einem Element beendet sein. Im schlechtesten Fall (worst case)<br />
ist genau das letzte Element identisch mit dem zu Suchenden. In diesem Fall<br />
entspricht die Anzahl der Suchschritte der Anzahl der Elemente.<br />
8 aus Wikipedia ‚QuickSort’ vom 20.02.2004<br />
9 nach Wikipedia ‚Lineare Suche’ vom 20.02.2004<br />
8
Mathematisch gesehen tritt der Erfolg bereits bei n/2 ein, also bereits bei<br />
Durchsuchung der Hälfte der Elemente ein.<br />
Beispiel für die Lineare Suche:<br />
Suchelement: 5<br />
Liste (Array) : 19 7 5 13<br />
Suchschritte Liste mit unsortierten Zahlen Vergleichsabfrage<br />
1 19 7 5 13 0 false<br />
2 19 7 5 13 1 false<br />
3 19 7 5 13 2 true<br />
4 19 7 5 13 3 false<br />
Das gesuchte Element wurde nach 3 Suchschritten <strong>und</strong> an 2ter Position (im<br />
Gegensatz zu Mathematik beginnt die Informatik bei der Zählung mit der 0)<br />
gef<strong>und</strong>en.<br />
4.2.2 Binäre Suche<br />
Bei der Binären Suche 10 geht man immer von einer vollständig sortierten Liste aus.<br />
Die Suche geht also einher mit einem vorherigen <strong>Sortier</strong>vorgang. Im Gegensatz zu<br />
der Linearen Suche verwendet man die Binäre Suche <strong>of</strong>t in Programmen, in denen<br />
man bereits Daten eingegeben <strong>und</strong> diese sortiert hat.<br />
Wie bei dem <strong>Sortier</strong>vorgang QuickSort wird aus dem Feld ein Mittelwert M bestimmt.<br />
Ist dieser Mittelwert größer als das zu suchendes Element so kann man alle<br />
Elemente rechts des Elementes aufgr<strong>und</strong> der Ordnung in dem Array verwerfen. Ist<br />
das Element größer als der Mittelwert M, so werden alle Elemente links des<br />
Mittelwertes verworfen. Ist das Element identisch mit dem zu suchenden Element, so<br />
kann der Suchvorgang erfolgreich abgebrochen werden. Ebenso wenn nur noch ein<br />
Element vorhanden ist (gilt nur bei der Annahme, dass das zu suchende Element<br />
100% Inhalt des Feldes ist).<br />
10 zusammengestellt aus Gumm, Sommer „Einführung in die Informatik“; Wikipedia „Binäre Suche“<br />
9
Im Gegensatz zur linearen Suche wird der Suchbereich bei jedem Suchvorgang<br />
halbiert <strong>und</strong> nicht nur um ein Element verkleinert. Demgegen<strong>über</strong> ist aber bei einem<br />
unsortierten Feld ein vorheriges <strong>Sortier</strong>en notwendig.<br />
Beispiel für die Binäre Suche:<br />
Zu suchendes Element: 55<br />
<strong>Sortier</strong>tes Feld: 50 – 65<br />
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65<br />
50 51 52 53 54 55 56 57<br />
54 55 56 57<br />
55<br />
Das zu suchende Element 55 wurde nach dem 2ten Suchvorgang gef<strong>und</strong>en.<br />
5. Effektivität der Algorithmen<br />
Effektivität ist Leistung/Zeit. Dies ist eine recht einfache, aber auch zutreffende<br />
Formel um die Effektivität eines Algorithmus zu bewerten. Um aber <strong>über</strong> die<br />
Effektivität eines Algorithmus etwas sagen zu können, muss man sich zuallererst<br />
einmal die Aufgabe, die vom Algorithmus durchgeführt wird, angucken. Jetzt lässt<br />
sich schnell sagen, dass die Aufgabe eines <strong>Sortier</strong>algorithmus das <strong>Sortier</strong>en von<br />
Datenbeständen ist <strong>und</strong> die Aufgabe eines Suchalgorithmus Daten in einer<br />
Datenbank oder einer Datei zu finden. Dennoch gibt es aber gravierende<br />
Unterschiede zwischen den Algorithmen. Für einen Programmierer ist es enorm<br />
wichtig, mit welchem Datenmaterial sein Programm <strong>und</strong> der darin enthaltene<br />
Algorithmus arbeiten soll. Folgende Fragen sind die Auswahl eines Algorithmus<br />
betreffend zu stellen:<br />
- Wie groß ist der Datenbestand, der durchsucht/sortiert werden soll?<br />
- Ist der Algorithmus allgemeingültig <strong>und</strong> somit auf allen Plattformen einsetzbar?<br />
- Welches ist das primäre Ziel meines Programms (Suchen? <strong>Sortier</strong>en? beides?)<br />
- Kann ich bei der Nutzung von Datenmaterial bereits auf einen sortierten<br />
Datenbestand zurückgreifen?<br />
10
Es gibt also ein recht breites Feld von Algorithmen für die unterschiedlichsten<br />
Aufgaben <strong>und</strong> mit einer gewissen Effektivität hinsichtlich einer speziellen Aufgabe.<br />
Löst man sich nun einmal von den ganzen Feinheiten, so wird man feststellen, dass<br />
neben dem Einsatzgebiet vor allem die Geschwindigkeit, mit der der Algorithmus<br />
arbeitet eine sehr große Rolle spielt. Die Geschwindigkeit, mit der ein Rechner<br />
Rechenoperationen ausführt, ist durch die CPU begrenzt. Der Algorithmus wirkt sich<br />
ins<strong>of</strong>ern auf die Geschwindigkeit aus, dass sich seine Anweisungen <strong>und</strong><br />
Bedingungen einfacher (mit weniger Rechenschritten) bzw. schwieriger (mit vielen<br />
Rechenschritten) ausführen lassen.<br />
Man unterscheidet zwischen der Gruppe der einfachen <strong>Sortier</strong>algorithmen <strong>und</strong><br />
(BubbleSort, SelectionSort, InsertionSort) <strong>und</strong> der Gruppe der schnellen<br />
<strong>Sortier</strong>algorithmen (ShellSort, QuickSort, HeapSort, DistributionSort). Sie<br />
unterscheiden sich sowohl in ihrem Quelltextumfang als auch in ihrer<br />
Geschwindigkeit, mit der sie ein sortiertes/unsortiertes Feld sortieren können.<br />
Um die Geschwindigkeitsunterschiede einmal deutlich zu machen, verwende ich die<br />
Laufzeitvergleiche von Gumm <strong>und</strong> Sommer (1998). Sie testeten Algorithmen, die mit<br />
C++ Code ausgeführt wurden, auf ihre Geschwindigkeit bei unsortierten generierten<br />
<strong>und</strong> bei bereits vorsortierten Daten .Die Ergebnisse der Untersuchung waren<br />
folgende:<br />
Bei einem Rechner mit 266MHz Intel Pentium 2 mit MMX betrug die <strong>Sortier</strong>zeit bei<br />
1000 Elementen <strong>und</strong> den generierten Daten bei BubbleSort 4,9s <strong>und</strong> bei<br />
SelectionSort 1,55s. Bei dem <strong>Sortier</strong>vorgang der bereits sortierten Daten betrug die<br />
<strong>Sortier</strong>zeit bei BubbleSort 0s <strong>und</strong> bei SelectionSort 1,55s. Natürlich war die<br />
<strong>Sortier</strong>zeit nicht 0 Sek<strong>und</strong>en, sondern war lediglich in einem Bereich, der von der<br />
Zeitmessung nicht mehr erfasst werden konnte, was bedeutet, dass die Zeit kleiner<br />
als 50 Millisek<strong>und</strong>en war. Bei SelectionSort erhielten sie den gleichen Wert für ein<br />
unsortiertes Feld <strong>und</strong> das vorsortierte Feld, was damit zusammenhängt, dass<br />
SelectionSort keine Abbruchbedingung besitzt, wie sie in BubbleSort vorhanden ist,<br />
die ein vorzeitiges Beenden des <strong>Sortier</strong>prozesses bewirkt hätte. Anhand der<br />
Ergebnisse lässt sich weiter erkennen, dass SelectionSort bei der <strong>Sortier</strong>ung der<br />
unsortierten Elemente eindeutig schneller war, diese Geschwindigkeit bei den<br />
sortierten Daten aber wieder einbüßt. BubbleSort ist also besser dazu geeignet<br />
bereits größtenteils sortierte Daten zu sortieren. Der unflexible<br />
11
SelectionSortalgorithmus hingegegen kommt mit einer relativ geringen Suchzeit bei<br />
den unsortierten Daten daher.<br />
Betrachtet man nun die Ergebnisse der schnellen <strong>Sortier</strong>algorithmen anhand des<br />
QuickSort Algorithmus für N=1.000.000, so sieht man, dass die <strong>Sortier</strong>zeit bei einem<br />
größeren Datenbestand um ein Vielfaches kleiner ist als bei den einfachen<br />
<strong>Sortier</strong>verfahren. Der Algorithmus erzielt für die unsortierten Daten eine Suchzeit von<br />
1,8s <strong>und</strong> für die bereits sortierten Daten einen Wert von 0,7s. QuickSort bietet also<br />
auf der einen Seite ein recht gutes Ergebnis bei den unsortierten Daten <strong>und</strong> auf der<br />
anderen Seite einen etwa halb so großen Wert bei den vorsortierten Daten. Zwar ist<br />
dies nicht der Idealwert, wie wir in bei BubbleSort vorgef<strong>und</strong>en haben, er ist aber<br />
auch nicht konstant wie bei SelectionSort.<br />
Über die Effektivität der linearen bzw. binären Suche lässt sich folgende Aussage<br />
machen. 11 Erhöht man die Datenmenge um den Faktor zwei, so bedeutet dies bei<br />
Verwendung der linearen Suche, das man einen doppelten Suchaufwand hat. Ein<br />
doppelter Suchaufwand führt eine doppelte Suchzeit mit. Bei der binären Suche<br />
hingegen bedeutet eine Verdoppelung des Datenumfangs lediglich eine einzige<br />
weitere Vergleichsoperation.<br />
Die Binäre Suche ist also weitaus geeigneter, um sehr große Datenmengen zu<br />
durchsuchen, sie setzt allerdings auch voraus, dass eine Ordnung innerhalb der<br />
Elemente vor dem Suchen vorhanden ist. Sie geht deshalb <strong>of</strong>t einher mit<br />
Prozeduren, die die Elemente in Arrays kopieren <strong>und</strong> sie daraufhin sortieren, um die<br />
benötigte Ordnung herzustellen. Die eigentliche Effizienz eines Vorgangs (z.B. dem<br />
Suchen) hängt also <strong>of</strong>t von mehreren Teilvorgängen (kopieren, sortieren (ordnen),<br />
suchen) ab.<br />
11 Die Darstellung folgt Gumm, H.-P.; Sommer,. : Einführung in die Informatik, S.256f<br />
12
6. Welche Voraussetzungen müssen neue Algorithmen erfüllen?<br />
Zuallererst muss man vorweg sagen, dass neue Algorithmen effektiver als die<br />
bereits vorhandenen sein müssen, um akzeptiert <strong>und</strong> genutzt zu werden. Dabei ist<br />
es unwichtig ob diese höhere Effektivität in allen Bereichen gegeben ist, oder nur in<br />
einem speziellen Such bzw. <strong>Sortier</strong>fall gegeben ist.<br />
Der Einsatz eines insgesamt langsameren Algorithmus brächte einem<br />
Programmierer keinen Vorteil. Der zweite Punkt, den neue Algorithmen erfüllen<br />
müssen, ist der, dass neue Algorithmen die „alten“ im Umfang des Quelltextes nicht<br />
um ein Vielfaches <strong>über</strong>steigen dürfen. Denn kein Programmierer würde 20 Seiten<br />
Quelltext implementieren, um eine geringere Suchzeit zu erreichen, die das<br />
Programm um Millisek<strong>und</strong>en schneller macht. Es muss bei neuen Algorithmen also<br />
eine Abwägung zwischen der Arbeit, die eine Implementierung eines neuen<br />
komplexeren Algorithmus verursacht, <strong>und</strong> einem daraus resultierenden Ergebnis<br />
stattfinden.<br />
13
7. Anhang<br />
7.1 Literaturverzeichnis<br />
Gumm, Heinz Peter / Sommer, Manfred: Einführung in die Informatik. 3. Auflage.<br />
München, Wien: Oldenburg Verlag, 1998<br />
Knuth, Donald E.: The Art <strong>of</strong> Computer Programming. Volume III: Sorting and<br />
Searching. 2. Auflage. Reading: Addison-Wesley Verlag, 1997<br />
Kutzner, Christian, „<strong>Sortier</strong>- <strong>und</strong> <strong>Suchalgorithmen</strong>“<br />
Verein für Informationstechnologie<br />
http://www.it-academy.cc/content/article_browse.php?ID=1603<br />
Liebknecht Gymnasium : <strong>Sortier</strong>algorithmen<br />
http://liebknecht-gymnasium.bei.t-online.de/sort/index.html<br />
Schreiber, Alfred : Was ist ein Algorithmus? (2000)<br />
http://uni-flensburg.de/mathe/zero/veranst/algorithmen/algo_abschn11/algo_absn11.html<br />
Wikipedia | freie Enzyklopädie Wikipedia<br />
http://de.wikipedia.org/wiki/Algorithmus<br />
http://de.wikipedia.org/wiki/BubbleSort<br />
http://de.wikipedia.org/wiki/Binäre_Suche<br />
http://de.wikipedia.org/wiki/Lineare_Suche<br />
http://de.wikipedia.org/wiki/QuickSort<br />
http://de.wikipedia.org/wiki/SelectionSort<br />
7.2 Verzeichnis der Abbildungen<br />
Abb. 1 „BubbleSort: Der erste Durchgang“ S. 4<br />
Abb. 2 „BubbleSort: Verlauf des Algorithmus“ S. 5<br />
14
7.3 Algorithmen für Delphi<br />
BubbleSort<br />
Procedure BubbleSort;<br />
var i,j : Integer;<br />
Begin<br />
For i:= N downto 1 Do<br />
For j:= 1 To i Do<br />
If (Data[j-1] > Data[j]) Then SwapValues( j-1, j );<br />
End;<br />
SelectionSort<br />
Procedure Selectionsort;<br />
var i, j, min : Integer;<br />
Begin<br />
For i:= 1 to N-1 Do<br />
Begin<br />
min:= i;<br />
For j:= i+1 To N Do<br />
If (Data[j] < Data[min]) Then min:= j;<br />
SwapValues( i, min);<br />
End;<br />
End;<br />
Lineare Suche<br />
function stringsuche (gesuchter_string: string; array_groesse: longint): longint {Die Function gibt den<br />
<strong>Index</strong> der Funstelle zurück}<br />
var i: longint; //Deine Laufvariable<br />
begin<br />
i:= 1;<br />
Result := 0;<br />
while (i
QuickSort<br />
Procedure QuickSort( l,r : Integer );<br />
var i : Integer;<br />
Begin<br />
If (r > l) Then<br />
Begin<br />
i:= Partition( l, r);<br />
QuickSortRekursiv( l, i-1 );<br />
QuickSortRekursiv( i+1, r );<br />
End;<br />
End;<br />
Function Partition( l,r : Integer ) : Integer;<br />
var v,t,i,j : Integer;<br />
Begin<br />
v:= Data[r];<br />
i:= l-1;<br />
j:= r;<br />
Repeat<br />
Repeat inc( i ); Until (Data[i] >= v);<br />
Repeat dec( j ); Until (Data[j] (r-i) Then<br />
Begin<br />
Stack.Push( l );<br />
Stack.Push( i-1 );<br />
l:= i+1;<br />
End<br />
Else<br />
Begin<br />
Stack.Push( i+1 );<br />
Stack.Push( r );<br />
r:= i-1;<br />
End;<br />
End<br />
Else<br />
Begin<br />
r:= Stack.Pop;<br />
l:= Stack.Pop;<br />
End;<br />
Until StackisEmpty;<br />
End;<br />
16
Erklärung zur selbstständigen Arbeit<br />
Hiermit erkläre ich, dass ich die vorliegende Arbeit selbstständig <strong>und</strong> ohne fremde<br />
Hilfe verfasst habe <strong>und</strong> keine anderen als die angegebenen Hilfsmittel verwendet<br />
habe.<br />
Insbesondere versichere ich, dass ich alle wörtlichen <strong>und</strong> sinngemäßen<br />
Übernahmen aus anderen Werken als solche kenntlich gemacht habe.<br />
Königswinter, den 31.03.2004<br />
Cornelius Herget<br />
_____________________<br />
17