二分查找​​针对的是一个有序的数据集合​​,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。

public static int binarySearch(int[] source, int target) {
int low = 0, high = source.length - 1, mid = 0;

if (target < source[low] || target > source[high] || low > high) {
return -1;
}

while (low <= high) {
// 防止low比high大溢出情况: mid = low + ((high - low) >> 1);
mid = (low + high) / 2;
if (source[mid] > target) {
// 比关键字大则关键字在左区域
high = mid - 1;
} else if (source[mid] < target) {
// 比关键字小则关键字在右区域
low = mid + 1;
} else {
return mid;
}
}
// 最后仍然没有找到,则返回-1
return -1;
}

public static int recursionBinarySearch(int[] source, int target, int low, int high) {
if (target < source[low] || target > source[high] || low > high) {
return -1;
}
// 初始中间位置
int mid = (low + high) / 2;
if (source[mid] > target) {
// 比关键字大则关键字在左区域
return recursionBinarySearch(source, target, low, mid - 1);
} else if (source[mid] < target) {
// 比关键字小则关键字在右区域
return recursionBinarySearch(source, target, mid + 1, high);
} else {
return mid;
}
}


public static void main(String[] args) {
int[] source = {1, 2, 3, 4, 5, 6, 7};

int key = binarySearch(source, 3);

System.out.println(String.format("key=[%s]", key));
}