二分查找
如有重复返回第一个出现位置的数组坐标
二分查找的时间复杂度为log2n(其查找前提是已排序啦,顺序查找当然是n)
public class BinarySearch {
public static void main(String[] args) {
int [] A = {1,3,3,3,3,4,4,4,5,5,5,5};
System.out.print("二分查找的结果(显示第一个出现的位置):"+getPos(A,A.length,4));
}
public static int getPos(int[] A, int n, int val) {
// write code here
int l=0,r=n-1;
while(l<=r){ //<=的时候
int pos = (l+r)/2; //(l+r+1)/2也行啊,但是不能+2(l=r)
int vs = ((Integer)A[pos]).compareTo(val);
if(vs==0){
//中间值相等,需要使用for循环返回第一个!
for (int i = pos-1; i >= l ; i--) {
if(((Integer)A[i]).compareTo((Integer)A[pos])==0){
pos--;
}else {
break;
}
}
return pos;
}else if (vs==1){
r=pos-1;
}else{
l=pos+1;
}
}
return -1;
}
}