因为每次都将搜索范围变为原来的二分之一,当范围长度被缩短为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); } }