06.10.2013 Aufrufe

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />

24.3 B<strong>in</strong>äres Suchen <strong>in</strong> sortierten Feldern<br />

Bei sortierten Feldern drängt sich das b<strong>in</strong>äre Suchen direkt auf, es ist analog zum Suchen im Lexikon:<br />

Man beg<strong>in</strong>nt nicht zuvorderst, sondern <strong>in</strong> der Mitte <strong>und</strong> blättert <strong>in</strong> immer kle<strong>in</strong>eren Schritten<br />

vorwärts oder rückwärts.<br />

Man vergleicht den zu suchenden Wert (Schlüssel) mit dem Wert <strong>in</strong> der Mitte des Feldes. Wenn der<br />

Wert grösser ist, sucht man <strong>in</strong> der vorderen Hälfte weiter, sonst <strong>in</strong> der h<strong>in</strong>teren Hälfte. Man wendet<br />

dazu e<strong>in</strong>fach das vorige Vorgehen erneut auf <strong>die</strong> passende Hälfte an. Das wird solange wiederholt<br />

bis man den Wert gef<strong>und</strong>en hat, oder sich das Feld nicht mehr halbieren lässt. Dieser Algorithmus<br />

braucht maximal log2(N) Vergleiche. Er funktioniert jedoch nur bei bereits sortierten Feldern.<br />

Als Beispiel suchen wir <strong>in</strong> der folgenden Tabelle den Wert 68<br />

7 12 13 33 39 41 42 43 48 50 51 53 57 67 68 74 77 83 85 87 96<br />

7 12 13 33 39 41 42 43 48 50 51 53 57 67 68 74 77 83 85 87 96<br />

7 12 13 33 39 41 42 43 48 50 51 53 57 67 68 74 77 83 85 87 96<br />

7 12 13 33 39 41 42 43 48 50 51 53 57 67 68 74 77 83 85 87 96<br />

7 12 13 33 39 41 42 43 48 50 51 53 57 67 68 74 77 83 85 87 96<br />

7 12 13 33 39 41 42 43 48 50 51 53 57 67 68 74 77 83 85 87 96<br />

7 12 13 33 39 41 42 43 48 50 51 53 57 67 68 74 77 83 85 87 96<br />

Wir vergleichen 68 zuerst mit dem mittleren Element (51) der Tabelle <strong>und</strong> stellen fest das wir <strong>in</strong> der<br />

oberen Hälfte des Feldes weitersuchen müssen. Wir vergleichen 68 erneut mit dem mittleren Element<br />

(77) des verbliebenen Feldes <strong>und</strong> stellen fest, das wir <strong>in</strong> dessen unterer Hälfte weitersuchen<br />

müssen. Und so landen wir nache<strong>in</strong>ander noch bei 67 <strong>und</strong> 74 bis wir im fünften Schritt den gesuchten<br />

Wert 68 gef<strong>und</strong>en haben.<br />

Die Effizienz <strong>die</strong>ses Algorithmus beruht darauf, dass das Feld <strong>in</strong> jedem Suchschritt halbiert wird<br />

<strong>und</strong> <strong>die</strong> Suche sich so sehr schnell dem Ziel nähert.<br />

Dieser Algorithmus lässt sich sehr schön rekursiv Implementieren: Solange das Element nicht gef<strong>und</strong>en<br />

ist, wendet <strong>die</strong> Funktion sich selbst auf <strong>die</strong> entsprechende übriggebliebene Hälfte an.<br />

Aufgabe 24.1:<br />

Implementieren Sie e<strong>in</strong> Modul B<strong>in</strong>ary.c mit der Funktion B<strong>in</strong>arySearch(), welche <strong>in</strong> e<strong>in</strong>em sortierten<br />

Array den angegebenen Wert sucht <strong>und</strong> e<strong>in</strong>en Zeiger auf se<strong>in</strong> erstmaliges Auftreten zurückliefert.<br />

Gedruckt am 11.09.2008 13:04:00 Letzte Änderung am: 11. September 2008 Version 2.4, I. Oesch 95/147

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!