二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回对应的数组下标,没有找到返回-1;
复杂度:
时间复杂度:O(logn)
空间复杂度:O(1)
如下示例,其中有序数组中, 是按照从小到大的顺序排列的。
非递归实现:
public static int erfen(int arr[], int key){
//int[] arr = {1,3,5,7,9,11,15,24};
int start = 0,end = arr.length - 1;
int middle;
//这里一定要相等,否则无法确认元素位置
while (start <= end){
//这里用减法是防止溢出
middle = start + ((end - start) >>> 1);
if (arr[middle] == key){
return middle;
}
else if (arr[middle] < key){
start = middle + 1;
}
else {
end = middle - 1;
}
}
return -1;
}
递归实现:
static int binarysearch(int array[], int low, int high, int target)
{
if (low > high) return -1;
int mid = (low + high)/2;
if (array[mid]> target)
return binarysearch(array, low, mid -1, target);
if (array[mid]< target)
return binarysearch(array, mid+1, high, target);
//if (midValue == target)
return mid;
}