二分查找 --Python

二分查找要求查找数组为有序的,所以得先sorted()一下。

递归实现:

# 递归
def binary_search(num, l_new):
    mid = len(l_new)//2
    if num > l_new[mid]:
        return binary_search(num, l_new[mid+1:])
    elif num < l_new[mid]:
        return binary_search(num, l_new[0:mid])
    else:
        return mid


if __name__ == '__main__':
    ll = [2, 3, 4, 5, 6]
    l_new = sorted(ll)
    num = 6
    key = binary_search(l_new, num)
    print("待查元素{}在列表中下标为:{}".format(num, key))

 结果:

待查元素6在列表中下标为:1

 ????

然后:

# 递归
def binary_search(l_new, num):
    print('l_new', l_new)
    mid = len(l_new)//2
    print('mid', mid)
    print('---')
    if num > l_new[mid]:
        return binary_search(l_new[mid+1:], num)
    elif num < l_new[mid]:
        return binary_search(l_new[0:mid], num)
    else:
        return mid


if __name__ == '__main__':
    ll = [2, 3, 4, 5, 6]
    l_new = sorted(ll)
    num = 6
    key = binary_search(l_new, num)
    print("待查元素{}在列表中下标为:{}".format(num, key))

 结果:

l_new [2, 3, 4, 5, 6]
mid 2
---
l_new [5, 6]
mid 1
---
待查元素6在列表中下标为:1

 嗖嘎,递归中间l_new在变化啊。然后去看看了别人怎么写。

def binarySearchRecursive(alist, item):
    if len(alist) == 0:
        return False

    else:
        mid = len(alist) // 2
        if alist[mid] == item:
            return True
        else:
            if item > alist[mid]:
                return binarySearchRecursive(alist[mid + 1:], item)
            else:
                return binarySearchRecursive(alist[:mid], item)

 ???我想要的是下标,我要个True能干啥。好吧,好像也能干点啥,不过想返回下标的递归写法如下:

# 递归
def binary_search_real(num, l_new, l, r):
    if l < r:
        mid = (l + r)//2
        print('mid', mid)
        print('---')
        if num > l_new[mid]:
            return binary_search_real(num, l_new, mid+1, r)
        elif num < l_new[mid]:
            return binary_search_real(num, l_new, l, mid-1)
        else:
            return mid


if __name__ == '__main__':
    ll = [2, 3, 4, 5, 6]
    l_new = sorted(ll)
    num = 6
    key = binary_search_real(6, l_new, 0, len(l_new))
    print("待查元素{}在列表中下标为:{}".format(num, key))

 结果:

mid 2
---
mid 4
---
待查元素6在列表中下标为:4

 ok.非递归实现如下:

# 非递归
def binary_search1(num_list, x):
    num_list = sorted(num_list)
    left, right = 0, len(num_list)
    while left < right:
        mid = (left + right) // 2
        if num_list[mid] > x:
            right = mid
        elif num_list[mid] < x:
            left = mid + 1
        else:
            return '待查元素{}在列表中下标为:{}'.format(x, mid)
    return '待查找元素%s不存在指定列表中' % x


if __name__ == '__main__':
    ll = [2, 3, 4, 5, 6]
    l_new = sorted(ll)
    key = binary_search1(l_new, 6)
    print(key)

结果:

扫描二维码关注公众号,回复: 3404036 查看本文章
待查元素6在列表中下标为:4

猜你喜欢

转载自blog.csdn.net/zdz0200/article/details/81781335