package search;
import java.util.*;
public class BinarySearch {
//这种是在[l,h]闭合区间查找
public int bSearch1(int l,int h,List<Integer> t,int v){
while(l <= h){
int m = (l+h)/2;
if(t.get(m)==v) return m;
else if(t.get(m)>v) h = m-1;
else l = m+1;
}
return -1;
}
//这种是在[l,h)左闭右开区间查找。。。。
public int bSearch2(int l,int h,List<Integer> t,int v){
while(l < h){
int m = (l+h)/2;
if(t.get(m) == v) return m;
else if(t.get(m) >v ) h = m;
else l = m+1;
}
return -1;
}
//求下界 1 2 2 2 3,假如找的是2,那么返回第一个2的下标,
// 1 3 5,假如找的是4,那么返回的下标是2(下标从0开始)
//求的是[l,h)左闭右开区间,但是返回的值在[l,h]之间
public int lowerSearch1(int l,int h,List<Integer> t,int v){
while(l < h){
int m = (l+h)/2;
if(t.get(m) >= v) h = m;
else l = m+1;
}
return l;
}
//这种求的是[l,h],实际就是令上面的h=h+1即可
public int lowerSearch2(int l,int h,List<Integer> t,int v){
while(l <= h){
int m = (l+h)/2;
/*
* 假如到某次循环t[m]是第一个大于等于v的数(即下界)
* 令p=m,那么经历h=m-1(即h=p-1)后,之后的循环中h将不会再改变(因为之后所有的t[m]都会小于v)
* 所以会一直进行l=m+1操作,直到l==h
* 当l==h时,m=(l+h)/2=h=p-1,然后l=m+1=h+1=p-1+1=p
* 此时l=p大于了h,将跳出循环
*/
if(t.get(m) >= v) h=m-1;
else l = m+1;
}
return l;
}
//求上界
public int upperSearch1(int l,int h,List<Integer> t,int v){
while(l < h){
int m = (l+h)/2;
if(t.get(m) <= v) l = m+1;
else h = m;
}
return l;
}
//求上界
public int upperSearch2(int l,int h,List<Integer> t,int v){
while(l <= h){
int m = (l+h)/2;
if(t.get(m) <= v) l = m+1;
else h = m-1;
}
return l;
}
public static void main(String[] args) {
}
}