借鉴:java源码-Arrays.binarySearch
二分法查找 (Binary Search)
二分法查找适用于数据量较大时,但是数据需要先排好顺序。主要思想是:(设查找的数组区间为array[low, high])。
1)确定该区间的中间位置K。
2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]b.array[k]<T 类似上面查找区间为array[k+1,……,high]。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将缩小一半,递归查找即可。时间复杂度为:O(log2n)。–百度百科
public class BinarySearch {
public static void main(String[] args) {
//首先查找算法前提是有序;
int[] arr = {1, 2, 5, 8, 11, 12, 15};
int target = 5;
int i = binarySearch(arr, 0, arr.length-1, target);
System.out.println(i);
}
//二分法
private static int binarySearch(int[] arr, int from, int to, int target) {
//这里局部变量重新赋值
int low = from, high = to;
while (low <= high) {
int mid = (low + high) >>> 1;
int midVal = arr[mid];
if (midVal < target) {
low = mid+1;
}else if(midVal>target){
high = mid-1;
}else{
return mid;
}
}
return -(from + 1);
}
}