Двоичный поиск значения в списке (или массиве) используется для упорядоченных последовательностей (отсортированных по возрастанию или убыванию). Заключается такой поиск в определении, содержит ли массив определенное значение, а также определение места его нахождения.
Описание алгоритма
- Находится средний элемент последовательности. Для этого первый и последний элементы связываются с переменными, а средний вычисляется.
- Средний элемент сравнивается с искомым значение. В зависимости от того, больше оно или меньше среднего элемента, дальнейший поиск будет происходить лишь в левой или правой половинах массива. Если значение среднего элемента окажется равным искомому, то поиск завершен.
- Одна из границ исследуемой последовательности становится равной предыдущему или последующему среднему элементу из п.2.
- Снова находится средний элемент, теперь уже в «выбранной» половине. Описанный выше алгоритм повторяется уже для данной последовательности.
Исходный код на Python
li = [0,3,5,7,10,20,28,30,45,56]
x = 45
i = 0
j = len(li)-1
m = int(j/2)
while li[m] != x and i < j:
if x > li[m]:
i = m+1
else:
j = m-1
m = int((i+j)/2)
if i > j:
print('Элемент не найден')
else:
print('Индекс элемента: ', m)
Алгоритм не правильно работает
Протестируйте когда x == -1, 0, 15, 25, 56, 100
Код выше исправлен. Это
Код выше исправлен.
Это прежний (содержащий ошибку) для сравнения: