编程之美-二分查找练习题
来源:互联网 发布:汪正扬看的编程书 编辑:程序博客网 时间: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;}
总之:剩余两个元素的时候,找最大的时候可能会出现死循环,找最小的不会。