前提:
数组的元素有序。
一般方法:
public static int binarySearch(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 -(1+min);
}
原理为:与中间值比较,如果要查询的值比中间值大,再次查询的最小值移动至原中间值的后一位;同理,如果要查询的值比中间值小,再次查询的最大值移动至原中间值的前一位(中间值已经进行了比较,如果恰好相等,那么直接返回中间值),如此往复循环,直到找到或者当查询范围最小值大于查询范围最大值时结束(注:(x为返回值)当返回值为负数值时表示该查询值不存在,但是可以在角标为(-x-1)地方插入该数使其有序。
可替换方法为:
在预处理加上:import java.util.Arrays;
可在下方调用方法
Arrays.binarySearch();
若结果为非负数,则要查找的数为数组中的元素,若为负数则可以在角标为(-x-1)地方插入该数使其有序(x为返回值)。
关于替换方法的疑问
为什么不直接返回指定位置的角标而返回负数(x为返回值)?
因为这样做返回正数可以有效地查找到该数在数组中存在,若为插入,则此角标前后均可插入改数,返回负数可以代表原数组中没有此数。
为什么返回的是(-x-1)而不是-x?
因为有一种特殊情况,当该数在原数组中存在或者可以插入在角标为0的位置时矛盾,此时两种情况的结果一样,分不清楚,为了避免这种情况,若该数在原数组中存在,即直接返回角标,若不存在,即返回角标的相反数减一,就解决实现与0重复而模糊不清的问题了。