Неправильная логика условия в задаче с поиском в массиве

https://ru.stackoverflow.com/a/1306764/461186

Помогите исправить Логику условия в этом ответе. Код красивый, но при входных данных когда array[middle] > target, код переход в else: left = middle -1

PS оставлю здесь также свой рабочий код. Просто мне понравился код, на который ссылка выше, поэтому и хотел его сделать полностью рабочим

def binary_search(array, target, left=0, right=None):
    if right is None:
        right = len(array) - 1
    if not array:
        return -1
    mid = (left + right + 1) // 2
    if array[mid] == target:
        return mid
    if left == right:
        return -1
    if array[0] < array[mid]:
        if target >= array[0]:
            if target > array[mid]:
                return binary_search(array, target, mid, right)
            return binary_search(array, target, left, mid - 1)
        return binary_search(array, target, mid, right)
    if target < array[0]:
        if target < array[mid]:
            return binary_search(array, target, left, mid - 1)
        return binary_search(array, target, mid, right)
    return binary_search(array, target, left, mid - 1)


def broken_search(array, target):
    return binary_search(array, target, 0, len(array) - 1)

Ответы (1 шт):

Автор решения: MBo
def BSinBroken (arr, value):
    lo = 0
    hi = len(arr)-1
    while lo <= hi:
        mid = (lo + hi) // 2
        if arr[mid] == value:
            return mid

        if arr[lo] <= arr[mid]: #сортирован левый
            if arr[lo] <= value <= arr[mid]:
                hi = mid - 1   #ищем в нём
            else:
                lo = mid + 1   #ищем в правом
        else:
                if arr[mid] <= value <= arr[hi]:
                    lo = mid + 1
                else:
                    hi = mid - 1
    return -1

Если хотите один раз назначать пределы, то объедините условия, но условие будет очень громоздким и нечитабельным.

→ Ссылка