分治算法③-使用分治算法实现二分查找-python

二分搜索

        该问题的常见形式是在一个有序数组中寻找某个元素。在本例子中假设数组array[ ]已经升序排列,变量left表示查找范围的左边界,right表示查找范围的有边界,mid表示查找范围的中间位置,target为要查找的元素。

        用分治法实现过程如下:    

        ①初始化。令left=0,即指向array[ ]的第一个元素;right=array.length-1,即指向有序列表array[ ]的最后一个元素。    

        ②mid=(left+right)// 2,即指向查找范围的中间元素。(low+high)为奇数的话,除以2并不能得到整数,此处向下取整,比如:4.5向下取整为4。    

        ③判定 left<=right是否成立,如果成立,转第4步,否则,说明该列表中没有指定元素,算法结束。    

        ④判断target 与 array[mid] 的关系。如果 target==array[mid] ,搜索成功,算法结束;如果 target >array[mid] ,令 left=middle+1,继续在数组的后半部分进行搜索;如果 target <array[mid] ,令 right=middle-1,继续在数组的前半部分进行搜索,即转向第2步。

 二分搜索有递归实现和非递归实现两种方式,非递归实现代码如下:

def binarySearch1(arr, len, target):
    # 初始化左右搜索边界
    left = 0
    right = len - 1
    while left <= right:
        # 中间位置:两边界元素之和/2向下取整
        mid = (left + right) // 2
        # arr[mid]大于target,即要寻找的元素在左半边,所以需要设定右边界为mid - 1,搜索左半边
        if target < arr[mid]:
            right = mid - 1
        # arr[mid]小于target,即要寻找的元素在右半边,所以需要设定左边界为mid+1,搜索右半边
        elif target > arr[mid]:
            left = mid + 1
            # 搜索到对应元素
        elif target == arr[mid]:
            return mid
        # 搜索不到返回 - 1
    return -1
​
​
alist = [9, 12, 23, 12, 12, 15, 33, 12, 32, 131]
length = len(alist)
target = 131
alist.sort()
result = binarySearch1(alist, length, target)
print(result)

 二分搜索递归实现代码如下:

def binarySearch2(array, left, right, target):
    if (left <= right):
        mid = (left + right) // 2
        # 搜索到对应元素
        if array[mid] == target:
            return mid
        elif array[mid] < target:
            # array[mid]小于target,即要寻找的元素在右半边,所以需要设定左边界为mid + 1,搜索右半边
            return binarySearch2(array, mid + 1, right, target)
        else:
            # array[mid]大于target,即要寻找的元素在左半边,所以需要设定右边界为mid - 1,搜索左半边
            return binarySearch2(array, left, mid - 1, target)
    else:
        return -1
​
​
alist = [9, 12, 23, 12, 12, 15, 33, 12, 32, 131]
length = len(alist)
target = 12
alist.sort()
result = binarySearch2(alist, 0, length - 1, target)
print(result)

二分搜索递归及非递归完整代码如下:

# 非递归方式实现二分搜索
def binarySearch1(arr, len, target):
    # pr初始化左右搜索边界
    left = 0
    right = len - 1
    while left <= right:
        # pr中间位置:两边界元素之和/ 2向下取整
        mid = (left + right) // 2
        # 搜索左半边 pr
        if target < arr[mid]:
            right = mid - 1
        # 搜索右半边
        elif target > arr[mid]:
            left = mid + 1
        # 搜索到对应元素
        elif target == arr[mid]:
            return mid
    return -1
​
​
# 递归方式实现二分搜索
def binarySearch2(array, left, right, target):
    if left <= right:
        mid = (left + right) // 2
        # 搜索到对应元素
        if array[mid] == target:
            return mid
        elif array[mid] < target:
            # array[mid]小于target,即要寻找的元素在右半边,所以需要设定左边界为mid + 1,搜索右半边
            return binarySearch2(array, mid + 1, right, target)
        else:
            # array[mid]大于target,即要寻找的元素在左半边,所以需要设定右边界为mid - 1,搜索左半边
            return binarySearch2(array, left, mid - 1, target)
    else:
        return -1
​
​
if __name__ == '__main__':
    array = [2, 13, 25, 69, 88]
    array.sort()
    location = binarySearch1(array, len(array), 13)
    print("非递归实现,查找到的元素位置为:" + str(location))
    location = binarySearch2(array, 0, len(array) - 1, 69)
    print("递归实现,查找到的元素位置为:" + str(location))

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
分治算法是一种常见的算法设计策略,它将一个大问题分解成若干个相同或类似的子问题,然后递归地解决这些子问题,最后将子问题的解合并起来得到原问题的解。Python中也可以使用分治算法来解决各种问题。 在Python中,可以使用分治算法解决许多问题,例如快速排序、归并排序、二分查找等。下面以归并排序为例介绍一下Python中的分治算法实现: 归并排序是一种经典的分治算法,它将一个待排序的数组不断地二分为两个子数组,直到每个子数组只有一个元素,然后将这些子数组合并成一个有序的数组。具体步骤如下: 1. 将待排序的数组不断地二分为两个子数组,直到每个子数组只有一个元素。 2. 对每个子数组进行排序,可以使用递归调用归并排序来实现。 3. 将排好序的子数组合并成一个有序的数组。 下面是一个简单的Python代码示例: ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = merge_sort(arr[:mid]) right = merge_sort(arr[mid:]) return merge(left, right) def merge(left, right): result = [] i, j = 0, 0 while i < len(left) and j < len(right): if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result.extend(left[i:]) result.extend(right[j:]) return result ``` 以上代码中,`merge_sort`函数使用递归的方式将数组不断地二分为两个子数组,并调用`merge`函数将排好序的子数组合并起来。`merge`函数则是将两个有序的子数组合并成一个有序的数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰灰老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值