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

来源:互联网 发布:汪正扬看的编程书 编辑:程序博客网 时间:2024/04/26 12:32
//查找任意一个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;}
总之:剩余两个元素的时候,找最大的时候可能会出现死循环,找最小的不会。

原创粉丝点击