算法2(二分查找法)

使用二分查找法的前置条件

  必须是一个已经排好序的数组

二分查找定义

  从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

示例图

循环版二分查找法

def bin_serach(data_set, val):
    """
    二分查找法
    :param data_set:传入一个已经拍好序的数组
    :param val: 目标值
    :return: 数组中目标值的下标
    """
    low = 0
    high = len(data_set) - 1
    while low <= high:
        mid = (low + high) // 2
        if data_set[mid] == val:
            return mid
        elif data_set[mid] < val:
            low = mid + 1
        else:
            high = mid - 1
    return '无此值'


ret = bin_serach([1, 2, 3, 4, 5, 6, 7], 11)
print(ret)

递归版二分查找法

def bin_serach(data_set, val, low, high):
    """
    二分查找法
    :param data_set: 传入一个已经拍好序的数组
    :param val: 目标值
    :param low: 列表最小下标
    :param high: 列表最大下标
    :return: 数组中目标值的下标
    """
    while low <= high:
        mid = (low + high) // 2
        if data_set[mid] == val:
            return mid
        elif data_set[mid] < val:
            return bin_serach(data_set, val, mid + 1, high)
        else:
            return bin_serach(data_set, val, low, mid - 1)
    return '无此值'


data_set = [1, 2, 3, 4, 5, 6, 7]
ret = bin_serach(data_set, 1, 0, len(data_set)-1)
print(ret)

 

posted @ 2018-07-16 21:37  争-渡  阅读(157)  评论(0)    收藏  举报