Двоичный поиск

В упорядоченном по возрастанию массиве целых чисел найти определенный элемент (указать его индекс) или сообщить, что такого элемента нет.

from random import random
N = 20
array = []
for i in range(N):
    array.append(int(random()*100))
array.sort()
print(array)

number = int(input())

low = 0
high = N-1
while low <= high:
    mid = (low + high) // 2
    if number < array[mid]:
        high = mid - 1
    elif number > array[mid]:
        low = mid + 1
    else:
        print("ID =", mid)
        break
else:
    print("No the number")

С комментариями:

from random import random
N = 20
array = []
# заполнение массива 
for i in range(N):
    array.append(int(random()*100))
    
# сортировка массива
array.sort()

print(array)

# число, которое требуется найти
number = int(input())

# нижний (начальный) индекс
low = 0
# верхний (конечный) индекс
high = N-1
# как только нижний индекс станет больше на 1 верхнего 
# или верхний на 1 меньше нижнего цикл остановится
while low <= high:
    # находится индекс середины массива или отрезка массива
    mid = (low + high) // 2
    # Если искомое число меньше числа с индексом середины,
    if number < array[mid]:
        # то верхняя граница сдвигается к середине (но на 1 до нее, 
        # т. к. середина была уже проверена)
        high = mid - 1
    # Если искомое число больше числа с индексом середины,
    elif number > array[mid]:
        # то нижняя граница сдвигается за середину
        low = mid + 1
    # Все остальные случаи возникают, когда искомое число 
    # равно числу с индексом mid, т.е. оно есть в массиве и найдено
    else:
        print("ID =", mid)
        # прерывание цикла
        break
# ветка else сработает, если не было break и условие при while стало ложным, 
# т.е. тогда, когда нижняя граница станет больше верхней. Это значит, что 
# в массиве нет искомого числа. 
else:
    print("No the number")

Пример выполнения:

[2, 8, 9, 19, 21, 28, 31, 31, 38, 40, 41, 47, 62, 66, 74, 88, 92, 92, 97, 97]
92
ID = 17