二分查找的简单实现

二分查找的实现

  • 二分查找可以由递归和递推实现
  • 由递推实现:
int erfen(int a[],int traget,int n){
     int left=0,right=n-1;
    while(left<=right){
        //带=号是left+1=right,不带是left=right
         int mid=(left+right)/2;
        //而是用 mid=low+((high-low)/2),原因是
        //使用(low+high)/2会有整数溢出的问题
         if(a[mid]==traget){
             return mid;
         }
         else if(a[mid]<traget){
             left=mid+1;
         }
         else if(a[mid]>traget){
             right=mid-1;
         }
  }
  return -1;
}
  • 用递归实现
int indexOf(int list[] , int left, int right, int target) {
    while (left <= right) {
        int index = (left + right) / 2;
        if(list[index] == target){
            return index;
        }else if (list[index] > target) {
            return indexOf(list, left, index - 1, target);
        } else if (list[index] < target) {
            return indexOf(list, index + 1, right, target);
        }
    }
    return -1}

3.还有c++已经封装好的函数upper_bound(),和lower_upper();

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a[9]={1,1,1,2,3,4,5,5,6};
    //使用upper_bound 和 lower_bound 必须是已经排好序的递增的数组
    sort(a,a+9);
    int m=upper_bound(a,a+9,1)-a;
    //返回值就是返回第一次出现大于那个要查找的数的地址
    int n=lower_bound(a,a+9,1)-a;
    //返回值就是返回第一次出现大于等于那个要查找的数的地址
    //如果没找到就返回的是last位置
    cout<<m<<endl;
    cout<<n;
    return 0;
    //输出为3  0
}

例题:
在这里插入图片描述
洛谷的二分查找题:

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int a[1000005];
int b[100005];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=0;i<m;i++){
        cin>>b[i];
    }
    for(int i=0;i<m;i++){
        int m=lower_bound(a,a+n,b[i])-a;
        if(b[i]!=a[m]) cout<<-1<<" ";
        else cout<<m+1<<" ";
    }
    return 0;
}```

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值