Python实现简单二分查找算法

想必都玩过猜数字的游戏,选择一个区间的数字,试着猜它是什么。如果你和一个很小的孩子玩这个游戏,他可能采取随机猜数字的策略 ,较大的孩子会按线性查找的方式,猜测1,2,3,4……知道猜到结果。当然聪明的人就会采取二分查找的方法每次取中间的数猜测。

问题分析:如果是n个数字,那么最坏的情况要猜n次才能成功,其实没有必要一个一个的猜,因为数字是有序的,它是一个二分搜索问题。我们可以使用折半查找策略,每次和中间的元素比较,(假定是升序)如果比中间元素小就去前半部分查找,如果比中间元素大,则去后半部分找。

算法思想:将有序序列分为规模大致相等的两等份,用两个变量来跟踪数据项列表中范围的端点。最初,目标可以是列表中的任何位置,所以开始我们将变量low和high分别设置为列表的第一个位置和最后一个位置。算法的核心是一个循环,查找剩余范围中间的数据项,将它与x进行比较,如果x小于中间数据项,则移动high,这样查找缩小到下半部分;如果x较大,则移动low,查找缩小到上半部分,当找到x,或low>high时,循环终止。

算法设计:用数组nums[]存储该有序序列,变量low和high表示查找范围的上界和下界,mid表示查找范围中间位置,x为特定查找元素。

(1)初始化。令low=0,即指向数组nums[]的第一个元素;high=len(nums)-1,即指向数组nums[]的最后一个元素。

(2)mid = ( low+high ) //2,即指示查找范围的中间元素

(3)判定 low <=high 是否成立,如果成立,转第(4)步,否则,算法结束

(4)判断x与nums[mid]的关系,如果x =nums[mid],则搜索成功,算法结束;如果x >nums[mid],则令low=mid+1;否则令high=mid+1,转为第(2)步。

代码如下:

def search(x,nums):
    low = 0
    heigh = len(nums)-1
    while low <=heigh:
        mid = (low+heigh)//2
        item = nums[mid]
        if x == item:
            return mid
        elif x > item:
            low = mid+1
        else:
            heigh = mid-1
    return -1
num = int(input("请输入你要查找的数:"))
print("你要找的数在数组从0开始的第",search(num,[1,2,3,4,4,5,6,7,8,9]),"个位置")

GitHub博客地址  https://zhan123.xin

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值