二分查找:对于长度为n的有序数组arr,判断数组中是否存在目标数key,如果存在,返回其在数组中的位置,如果不存在,返回-1。其原理是:先设置查找区域low~high,比较arr[(low + high)/2]与key的大小, 如果key大于arr[(low + high)/2],则查找区域变为(low + high)/2 ~high,否则,查找区域变为low~(low + high)/2。依次进行比较,知道查找区域为0.
二分查找的时间复杂度为O(logn)。
二分查找的空间复杂度为O(1)。
算法实现代码:
public static int binarySearch(int[] arr, int key)
{
int max, min, mid;
min = 0;
max = arr.length - 1;
mid = (max + min) / 2;
while(arr[mid] != key)
{
if(key > arr[mid])
min = mid + 1;
else if(key < arr[mid])
max = mid - 1;
if(max < min)
return -1;
mid = (min + max) / 2;
}
return mid;
}
- 二分查找的应用:给定一个数值key,将其插入有序数组中,返回其位置。
public static int test(int[] arr, int key)
{
int max, min, mid;
min = 0;
max = arr.length - 1;
while(min <= max)
{
mid = (min + max) >> 1;//
if(key > arr[mid])
min = mid + 1;
else if(key < arr[mid])
max = mid - 1;
else
return mid;
}
return min;
}