package info.frady.algo;
import java.util.Arrays;
import java.util.LinkedList;
/**
* 写一个二分查找
* 20200209
* meng3.wei
*/
public class BinarySearch {
public static void main(String args[]){
int[] arrs={1,2,3,4,5,7,8, 9,11,15,56,77, 88};
/*System.out.printf("%d 在数组的位置是 %d\n",1,search(arrs,1));
System.out.printf("%d 在数组的位置是 %d\n",3,search(arrs,3));
System.out.printf("%d 在数组的位置是 %d\n",5,search(arrs,5));
System.out.printf("%d 在数组的位置是 %d\n",7,search(arrs,7));
System.out.printf("%d 在数组的位置是 %d\n",8,search(arrs,8));
System.out.printf("%d 在数组的位置是 %d\n",9,search(arrs,9));
System.out.printf("%d 在数组的位置是 %d\n",11,search(arrs,11));
System.out.printf("%d 在数组的位置是 %d\n",15,search(arrs,15));
System.out.printf("%d 在数组的位置是 %d\n",56,search(arrs,56));
System.out.printf("%d 在数组的位置是 %d\n",77,search(arrs,77));
System.out.printf("%d 在数组的位置是 %d\n",88,search(arrs,88));
System.out.printf("%d 在数组的位置是 %d\n",0,search(arrs,0));
System.out.printf("%d 在数组的位置是 %d\n",99,search(arrs,99));*/
LinkedList<Integer> list=new LinkedList<Integer>();
for (int i = 0; i < arrs.length; i++) {
list.add(arrs[i]);
}
System.out.println(Arrays.toString(arrs));
System.out.printf("%d 在数组的位置是 %d\n",1,searchList(list,1));
System.out.printf("%d 在数组的位置是 %d\n",3,searchList(list,3));
System.out.printf("%d 在数组的位置是 %d\n",4,searchList(list,4));
System.out.printf("%d 在数组的位置是 %d\n",5,searchList(list,5));
System.out.printf("%d 在数组的位置是 %d\n",7,searchList(list,7));
System.out.printf("%d 在数组的位置是 %d\n",8,searchList(list,8));
System.out.printf("%d 在数组的位置是 %d\n",9,searchList(list,9));
System.out.printf("%d 在数组的位置是 %d\n",11,searchList(list,11));
System.out.printf("%d 在数组的位置是 %d\n",15,searchList(list,15));
System.out.printf("%d 在数组的位置是 %d\n",56,searchList(list,56));
System.out.printf("%d 在数组的位置是 %d\n",77,searchList(list,77));
System.out.printf("%d 在数组的位置是 %d\n",88,searchList(list,88));
System.out.printf("%d 在数组的位置是 %d\n",0,searchList(list,0));
System.out.printf("%d 在数组的位置是 %d\n",99,searchList(list,99));
}
public static int search(int[] arrs,int a){
int low=0;
int high=arrs.length-1;
while(low<=high){
int mid=(low+high)/2;
if(arrs[mid]==a){
return mid;
}else if(arrs[mid]>a){//要查找的a在当前的左边,需要修改高位
high=mid-1;
}else{//在右边,需要修改低位
low=mid+1;
}
}
return -1;
}
public static int searchList(LinkedList<Integer> arrs, int a){//返回的是 大于等于这个数字的 最小数字位置
int low=0;
int high=arrs.size()-1;
while(low<=high){
int mid=(low+high)/2;
if(arrs.get(mid)==a){
return mid;
}else if(arrs.get(mid)>a){//要查找的a在当前的左边,需要修改高位
high=mid-1;
}else{//在右边,需要修改低位
low=mid+1;
}
}
return low;
}
}