编程之美-二分查找练习题

//查找任意一个i,使得arr[i]等于v,不存在返回-1 
int bsearch_any_i(int arr[],int l,int r,int v){
    int left=l,right=r;
    while(left<=right){
        int mid=left+(right-left)/2;
        if(arr[mid]<v)
            left=mid+1;
        else if(arr[mid]>v)
            right=mid-1;
        else
            return mid;
    }
    return -1;
}

//查找最小的i使得arr[i]等于v,不存在返回-1,没有出现死循环
int bsearch_min_i(int arr[],int l,int r,int v){
    int left=l,right=r;
    while(left<right){
        int mid=left+(right-left)/2;
        if(arr[mid]>=v)
            right=mid;
        else
            left=mid+1;
    }
    if(arr[right]==v) return left;
    else return -1;
}

//查找最大的i使得arr[i]等于v,不存在返回-1,可能出现死循环
int bsearch_max_i(int arr[],int l,int r,int v){
    int left=l,right=r;
    while(left<right-1){
        int mid=left+(right-left)/2;
        if(arr[mid]<=v)
            left=mid;
        else
            right=mid-1;
    }
    if(arr[right]==v) return right;
    else if(arr[left]==v) return left;
    else return -1;
} 

//这个地方我的right没有减1,感觉不需要,没有出现死循环 
//查找最小的i使得arr[i]大于v,不存在则返回-1 
int bsearch_min_greater_i(int arr[],int l,int r,int v){
    int left=l,right=r;
    while(left<right){
        int mid=left+(right-left)/2;
        if(arr[mid]>v)
            right=mid;
        else
            left=mid+1;
    }
    if(arr[right]>v) return right;
    else return -1;
}

//查找最大的i使得arr[i]小于v,不存在则返回-1,可能会出现死循环
int  bsearch_max_greater_i(int arr[],int l,int r,int v){
    int left=l,right=r;
    while(left<right-1){
        int mid=left+(right-left)/2;
        if(arr[mid]<v)
            left=mid;
        else
            right=mid-1;
    }
    if(arr[right]<v) return right;
    else if(arr[left]<v) return left;
    else return -1;
}
总之:剩余两个元素的时候,找最大的时候可能会出现死循环,找最小的不会。

    原文作者:bladeLight
    原文地址: https://blog.csdn.net/chen895281773/article/details/8606697
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞