二分查找
/**
* 二分查找:对于有序数组(泛型):明确变量的含义以及循环不变量的维护
* @return
*/
public<E extends Comparable<E>> int binarySearch(E arr[],int n,E target){
//在[l...r]的范围里寻找target(循环不变量:控制边界)
int l=0 ,r =n-1;
while(l<=r){
//当l == r 时,区间[l...r]依然有效
//整形溢出:用减法而不是加法:(r+l)/2
int mid = l+(r-1)/2;
//此时中间元素就是要寻找的target
if(target.compareTo(arr[mid]) == 0){
return mid;
}
//要寻找的元素target比中间元素要大
if(target.compareTo(arr[mid]) >0){
l = mid +1;
}else{
//要寻找的元素target比中间元素要小
r = mid -1;
}
}
return -1;
}