07.10.2013 Aufrufe

Facharbeit über Sortier- und Suchalgorithmen - Index of

Facharbeit über Sortier- und Suchalgorithmen - Index of

Facharbeit über Sortier- und Suchalgorithmen - Index of

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!