因为每次都将搜索范围变为原来的二分之一,当范围长度被缩短为1的时候,就完成了查找。所以二分查找法的时间复杂度为O(logN)。
如果一个算法用常数时间(O(1))将问题的大小削减为其一部分(通常是1/2),那么该算法就是(O(logN))。
2^x = N 所以x=log2N。
代码如下
public static int binarySearch() {
int a[] = {1,3,2,8,4,5,9,6,7};
int x = 5;
Arrays.sort(a);
int begin = 0;
int end = a.length-1;
while (begin<=end){
int mid = (begin + end)/2;
if (a[mid]==x){
return mid;
}
if (a[mid]>x){
end = mid - 1;
}
if (a[mid]<x){
begin = mid + 1;
}
}
//找不到返回-1
return -1;
}
二分查找的递归法
public static int binarySearch2(int a[],int target,int begin,int end){
Arrays.sort(a);
int mid = (begin+end)/2;
//遇到错误情况返回-1
if (target < a[begin] || target >a[end] || begin > end){
return -1;
}
//找到返回目标索引
if (a[mid] == target){
return mid;
}else if (a[mid] > target){
return binarySearch2(a,target,begin,mid);
}else {
return binarySearch2(a,target,mid,end);
}
}