二分法计算点所在的范围

float axx[] = {10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300};
int arrLen = sizeof(axx)/sizeof(axx[0]);

void startSearch(int mid,int start,int end,int target){
    
    assert(start >= 0);
    assert(end <= arrLen);
    assert(start <= end);
    assert(mid>=start);
    assert(mid<=end);
    
    if (target >= axx[mid]) {
        
        if (target <= axx[mid+1]) {
            cout << "1找到此位置,位置为" << mid << endl;
            return;
        }else
        {
             //在后半部分
            int newMid = (end - mid)/2 + mid;
            startSearch(newMid,mid, end,target);
        }
    }else
    {
       
        if (mid >= 1) {
            if (target >= axx[mid-1]) {
                cout << "2找到此位置,位置为" << mid -1 << endl;
                return;
            }else
            {
                //在前半部分
                int newMid = (mid - start)/2 + start;
                startSearch(newMid, start, mid,target);
            }
        }else
        {
            cout << "3找到此位置,位置为" << 0 << endl;
            return;
        }
    }
}


int main(){
    
    int mid = arrLen/2;
    
    assert(arrLen > 0);
    
    int target = 0;
    for (int i = 11 ; i < 299; ++i) {
        
        target = i;
        if (target < axx[0] || target > axx[arrLen-1]) {
            cout << "超出了范围" << endl;
            exit(-1);
        }
        
        startSearch(mid,0,arrLen - 1,target);
    }
    return 0;
}



前提是需要查找的数组为 有序的


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值