1.一般二分查找
求元素出现的位置,如果没有则返回-1;
int binarySearch(int a[], int key){
int len = a.length;
int left = 0;
int right = len-1;
while(left < right){
int mid = left + (right-left)/2;
if(a[mid] == key)
return mid;
if(a[mid] > key)
right = mid - 1;
else
left = mid + 1;
}
return -1;
}
2.求上界
返回插入key后序列仍有序的最后面的位置。
如果数组中有多个元素都等于key,则返回最后一个key的下标+1,不存在则返回在此处插入key后仍有序的插入位置。
int upper(int[] a, int key){
int len = a.length;
int left = 0;
int right = len-1;
while(left < right){
int mid = left + (right-left)/2;
if(a[mid] > key) //a[mid] > key,说明key在左侧,也有可能是中间,则更新区间为[left,mid];
right = mid;
else //a[mid] = key,至少存在一个,右边可能还有,所以更新区间为[mid,right]
left = mid + 1; //a[mid] < key,说明key在右侧,则更新区间[mid+1,right]
}
return left;
}
3.求下界
返回插入key后序列仍有序的最前面的位置。
求下界:如果数组中有多个元素都等于key,则返回第一个key的下标,不存在则返回在此处插入key后仍有序的插入位置。
int lower(int[] a, int key){
int len = a.length;
int left = 0;
int right = len-1;
while(left < right){
int mid = left + (right-left)/2;
if(a[mid] >= key) //a[mid] > key,说明key在左侧,也有可能是中间,则更新区间为[left,mid]; //a[mid] = key,至少存在,左边可能还有,所以更新区间为[left,mid];
right = mid;
else //a[mid] < key,说明key在右侧,则更新区间[mid+1,right]
left = mid+1;
}
return left;
}