二分搜索应用

1 从有序数组中查找数组中比某个数大的或比某个数小的第一个数

用二分搜索查找数组中比某个数大的或比某个数小的第一个数。例如在数组中查找比7大的数为8,比7小的数为6,如果能查找到则返回对应数的索引。如果返回的索引查处的数组sums的取值范围说明没找到合适的值

012345
0256812

-查找比某个数大的第一个数Python代码如下

def searchFirstBigThan(left, right, key, sums):
    while(left <= right):
        mid = (left + right) / 2
        if(sums[mid] >= key):
            right = mid - 1
        else:
            left = mid + 1
    return left
  • 查找比某个数小的第一个数的Python代码为:
def searchFirstLessThan(left, right, key, sums):
    while(left <= right):
        mid = (left + right) / 2
        if(sums[mid] <= key):
            left = mid + 1
        else:
            right = mid - 1  
    return right

测试代码

sums=[0,2,5,6,8,12,15]
r = searchLessThan(0, 6, 16, sums)

2 从部分排序的数组中找出最小值

例如数组num=[6,7,8,9,-4,-3,-2,-1,0],其中子数组[6,7,8,9]和[-4,-3,-2,-1,0]是有序的。[-4,-3,-2,-1,0]与[6,7,8,9]合并在一起是整个有序的。要求从[6,7,8,9,-4,-3,-2,-1,0]中找出最小值-4。用二分查找,low与up分别指向数组的首尾,mid=(low+up)/2,如果num[mid]>num[up],说明最小值在[mid+1,up]间,关系low=mid+1,如果num[mid]

def searchMin(num):
    low = 0
    up = len(num) - 1
    while(low < up):
        mid = (low + up) / 2
        if(num[mid] > num[up]):
            low = mid + 1
        elif(num[mid] < num[up]):
            up = mid
    return low

测试代码

sums = [6,7,8,9,-4,-3,-2,-1,0]
r = searchMin(sums)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值