5、二分查找

1、问题描述

给定一个排序的整数数组(升序)和一个要查找的目标整数 target ,如果在数组中找到 target,则返回 True,否则返回 False。

 

2、问题示例

输入数组 [ 1, 4, 4, 5, 7, 7, 8, 9, 9, 10 ] 和目标整数 1,输出 True,表示找到目标整数 1。

输入数组 [ 1, 2, 3, 3, 4, 5, 10 ] 和目标整数 3,输出 True,表示找到目标整数 3。

输入数组 [ 1, 2, 3, 3, 4, 5, 10 ] 和目标整数 6,输出 False,表示未找到目标整数 6。

 

3、代码实现

递归实现:

1)定义开始位置 start,值为数组第一个元素的下标 0,定义结束位置 end,值为搜索范围的最后一个元素的下标 len(nums) - 1;

2)如果 start 大于 end,即查找范围内的数据的第一个数据的下标位置大于最后一个数据的下标位置,表示该范围内的数据均已查找完且未查找到目标数据,搜索结束,返回 False;

3)取查找范围数据的中间值位置坐标 mid:

a、如果目标数据 target 等于该中间位置的数据 nums[mid],则表示已找到该数据,搜索结束,返回 True;

b、如果目标数据 target 小于该中间位置的数据 nums[mid],则表示 target 在 start 位置的数据与 mid - 1 位置的数据之间,则把 start 到 mid - 1 之间的数据 nums[ : mid ] 重新传入本函数,继续搜索,直到搜索结束为止;

c、如果目标数据 target 大于该中间位置的数据 nums[mid],则表示 target 在 mid + 1 位置的数据与 end 位置的数据之间,则把 mid + 1 到  end 之间的数据 nums[ mid + 1 : ] 重新传入本函数,继续搜索,直到搜索结束为止。

 

非递归实现:

1)定义开始位置 start,值为数组第一个元素的下标 0,定义结束位置 end,值为搜索范围的最后一个元素的下标 len(nums) - 1;

2)如果 start 大于 end,即查找范围内的数据的第一个数据的下标位置大于最后一个数据的下标位置,表示该范围内的数据均已查找完且未查找到目标数据,搜索结束,返回 False;

3)while 循环,当 start 小于或等于 end 时,取查找范围数据的中间值位置坐标 mid:

a、如果目标数据 target 等于该中间位置的数据 nums[mid],则表示已找到该数据,搜索结束,返回 True;

b、如果目标数据 target 小于该中间位置的数据 nums[mid],则表示 target 在 start 位置的数据与 mid - 1 位置的数据之间,则把 end 的值改为 mid - 1,重新 while 循环;

c、如果目标数据 target 大于该中间位置的数据 nums[mid],则表示 target 在 mid + 1 位置的数据与 end 位置的数据之间,则把 start 的值改为 mid + 1,重新 while 循环。

4)如果执行 while 循环 start 小于或等于 end 时,返回 True,则表示已找到该数据,搜索结束;

如果因 start 大于 end 导致 while 循环结束,则返回 False,表示数组的数据均已查找完且未查找到目标数据,搜索结束。

class Solution:
    def binarySearch_1(self, nums, target):
        # 递归实现
        start = 0
        end = len(nums) - 1

        if start > end:
            return False

        mid = (start + end) // 2
        if target == nums[mid]:
            return True
        elif target < nums[mid]:
            return self.binarySearch_1(nums[:mid], target)
        else:
            return self.binarySearch_1(nums[mid + 1:], target)

    def binarySearch_2(self, nums, target):
        # 非递归实现
        start = 0
        end = len(nums) - 1

        while start <= end:
            mid = (start + end) // 2

            if target == nums[mid]:
                return True
            elif target < nums[mid]:
                end = mid - 1
            else:
                start = mid + 1

        return False


if __name__ == "__main__":
    nums = [1, 2, 3, 3, 4, 5, 10]
    target1 = 3
    target2 = 6

    solution = Solution()

    print("递归实现:")
    if solution.binarySearch_1(nums, target1):
        print("目标数据 {} 存在数组中!".format(target1))
    else:
        print("目标数据 {} 不在数组中!".format(target1))

    print("\n非递归实现:")
    if solution.binarySearch_2(nums, target2):
        print("目标数据 {} 存在数组中!".format(target2))
    else:
        print("目标数据 {} 不在数组中!".format(target2))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值