Это всего лишь цикл for...in
. Проверьте документацию в Mozilla .
Вы на самом деле ничего не делаете с start_point
и end_point
.
Кроме того, если элемент в середине больше, чем искомый элемент, не хотите ли вы переместить end_point
в середину? То же самое относится и к вашему elif-утверждению - если элемент посередине меньше, чем искомый элемент, вам нужно переместить start_point
в середину.
Прежде чем решить проблему, давайте обсудим бинарный поиск,
Бинарный поиск: Поиск отсортированного массива путем многократного деления интервала поиска пополам. Начните с интервала, охватывающего весь массив. Если значение ключа поиска меньше, чем элемент в середине интервала, сузьте интервал до нижней половины. В противном случае сузьте его до верхней половины.
Здесь вам нужно менять среднюю точку каждый раз, когда цикл завершает один цикл, а затем вам нужно проверить, находится ли элемент в нижней или верхней половине, если он присутствует в нижней половине, тогда вам нужно изменить конечную точку, а не запускать -point, а если в верхней половине, то изменить нижнюю точку
И еще одна важная вещь: в вашем условии while, если элемент отсутствует, он будет находиться в бесконечном цикле, поэтому ваше условие while должно быть в то время как (end_point> start_point), потому что мы меняем точки в каждом цикле.
Код для справки:
def binary_search(array,item):
start_point = 0
end_point = len(array)
array.sort()
print(array)
while end_point > start_point:
mid_point = int((start_point + end_point) / 2)
if array[mid_point] < item:
start_point = mid_point+1
elif array[mid_point] > item:
end_point = mid_point-1
elif array[mid_point] == item:
print(mid_point)
return
print("ELement is not present")
binary_search([0,99,2,6,7,8],3)
Что идет не так, так это то, что цикл while
сравнивает одно и то же значение array[mid_point]
на каждой итерации, таким образом, заканчивая бесконечным циклом, если условие удовлетворяется.
Бинарный поиск является рекурсивным подходом и выполняет итерации по меньшим элементам одного и того же списка с каждой итерацией, пока не будет получен индекс требуемого элемента, если он присутствует в списке. Ваш код будет работать, если вы нарежете array
и вызовете binary_search
рекурсивно, передавая новый список в качестве аргумента. Цикл while
может быть заменен простым условием if
.
Для получения дополнительной информации, проверьте эту ссылку и сравните с вашей функцией, чтобы понять разницу. :)