Wir schreiben eine Funktion namens binary_search(li, el)
. Die Funktion nimmt eine sortierte Liste li
und ein gesuchtes Element el
an. Wenn sie das Element in der Liste findet, gibt sie die Position (den Index) des Elements zurück. Wenn nicht, gibt sie None
zurück.
Vor uns liegt eine sortierte Liste mit dem kleinsten Element ganz links und dem grössten Element ganz rechts. Bei der Binärsuche schauen wir uns jeweils das mittlere Element des Suchbereichs1) an und vergleichen es mit dem gesuchten Element. Es ergeben sich drei Möglichkeiten:
Bei 2. und 3. wird der Suchbereich halbiert und es ergibt sich daraus eine neue Mitteposition. Das Element an dieser Position verleichen wir erneut mit dem gesuchten Element. Wir wiederholen diese Schritte solange, bis:
None
zurück.Wir programmieren also einen Algorithnus, bei dem eindeutige Schrite immer wieder durchgeführt werden – solange, bis die Arbeit erledigt ist. Wie bei den meisten Algorithmen sind hierzu zuerst ein paar einmalige Schritte nötig. Dann kommt eine Schleife, in der die Schritte stehen, die wiederholt werden sollen.
Nachdem wir den Funktionskopf hingeschrieben haben, legen wir die beiden Variablen left
und right
fest, mit denen wir den Suchbereich abstecken. Zu Beginn ist left 0 und right so gross wie der grösste Index der Liste.
Wir müssen so lange suchen, wie wir den Suchbereich noch verkleinern können. Es kann sein, dass solange gesucht wird, bis der Suchbereich sich nur noch auf ein einziges Element beschränkt. Dann sind die Variablen left
und right
gleich gross. Wenn jetzt nichts gefunden wird, müssen wir abbrechen. Wir suchen also solange, wie left
kleiner als oder gleich gross wie right
ist.2)
Zuerst berechnen wir die Mitteposition. Sie ergibt sich aus zwei Schritten: Erstens von der rechten Position die linke abziehen und diesen Wert durch 2 teilen. Zweitens die linke Position hinzuaddieren. Also: middle = (right - left) // 2 + left
. Dieser Term lässt sich in eine einfachere Form bringen: middle = (left + right) // 2
.3)
Danach vergleichen wir das Element an der Mitteposition mit dem gesuchten Element. Da es drei Möglichkeiten gibt, ist eine if-elif-else
-Verzweigung geeignet:
links
auf die Mitteposition + 1 setzen.rechts
auf die Mitteposition - 1 setzen.
Wenn wir uns in der Funktion und nach der while-Schleife befinden, heisst das:
Wir sind nie zur Zeile return middle
gekommen, denn mit return
wird die Funktion verlassen.
Die Bedingung der while-Schleife ist nicht mehr erfüllt, das heisst: es ist kein Suchbereich mehr übrig.
Also geben wir None
zurück.