1.二分查找某个元素
1)递归实现
int dichotomy_find(int * sqList,int a,int b,int value){ if(a>b) return -1; int m=(a+b)/2; if(sqList[m]==value) return m; else if(sqList[m]>value)return dichotomy_find(sqList,a,m-1,value); else return dichotomy_find(sqList,m+1,b,value); }
2)非递归实现
int bisearch(int arr[],int n,int x){ int low=0,high=n-1,mid; while(low<=high){ mid=(low+high)/2; if(arr[mid]==x) break; else if(arr[mid]<x) low=mid+1; else high=mid-1; } if(arr[mid]!=x) return -1; return mid; }
2.二分查找范围元素
int get_left(int * sqList,int a,int b,int s){ //find:sqList[l-1]<s , sqList[l]>=s int m=(a+b)/2; if(sqList[m]>=s){ if(a==b) return m; else return get_left(sqList,a,m,s); }else{ if(a==b) return m; else return get_left(sqList,m+1,b,s); } } int get_right(int * sqList,int a,int b,int t){ //find:sqList[l-1]<s , sqList[l]>=s int m=(a+b)/2; if(sqList[m]<=t){ if(a==b) return m; else return get_right(sqList,m+1,b,t); }else{ if(a==b) return m; else return get_right(sqList,a,m,t); } }
效果: