搜索

本文介绍了一种高效的搜索算法——二分搜索。通过利用已排序数组的特点,该算法能在O(logn)的时间复杂度内完成搜索任务。文章还提供了一个Python实现示例,包括如何在未找到目标值时将其正确插入到数组中的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分搜索

    对已经排好序的n个元素a[0:n-1],现在要在这n个元素中找出一个特定元素。
    首先比较容易想到的方法是顺序搜索,逐个比较a[0:n-1]中的元素,知道找到某个元素,或者搜索完整个数组后确定x不在其中。
    然而,这个方法没有很好的利用n个排好顺序的元素这个条件。最坏的情况下需要O(n)次比较。
    二分搜索方法充分利用了元素间的位置关系,采用分治策略,可在最坏的情况下用O(log n)时间内完成搜索任务。
    其基本思想是,将n个元素分成个数大致相同的两半,去中间值a[n/2]与x做比较。如果x与a[n/2]相等,则找到x,算法终止。如果x比较大,说明x可能在数组的右半段,则在数组的右半段继续搜索。如果x比较小,说明x可能在数组的左半端,则在数组的左半段继续搜索。
    增加点稍许难度,程序需要完成如下任务:
1. 如果需要搜索的数值在数组中,则返回索引值
2. 如果不在其中,则将搜索的数值,添加到数组中的正确位置,使得数组中的元素还是按照递增的顺序。
import numpy as np
arr=np.random.randint(10,size=5).tolist()
arr.sort()
print(arr)
def binarySearch(arr,x):
    left=0
    right=len(arr)-1
    while left<=right:
        middle=int((left+right)/2)
        if x==arr[middle]:
            return arr.index(x)
        elif x>arr[middle]:
            left=middle+1
        else:
        right=middle-1
    arr.insert(left,x)
    return arr
print(binarySearch(arr, 1))

    最后主要需要注意的是,搜索停止的条件。x不在数组中,最后一次搜索的状况如下图。

这里写图片描述

    若x>arr[middle],则left的索引位置变为蓝色笔所写的位置,说明数组中right索引左侧所有元素都比x小,left右侧(包含left)所有元素都比x大,则left为插入x的索引位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值