/**
* 二分查找循环实现
*
* @param key 关键字
* @param arr 有序数组
* @return 下标
*/
public static int find(int key, int[] arr) {
int lo = 0;
int hi = arr.length - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (key < arr[mid]) {
hi = mid - 1;
} else if (key > arr[mid]) {
lo = mid + 1;
} else {
return arr[mid];
}
}
return -1;
}
/**
* 二分查找递归实现
*
* @param key keyword
* @param arr 有序数组
* @param begin 开始索引
* @param end 结束索引
* @return
*/
public static int find(int key, int[] arr, int begin, int end) {
int mid = begin + (end - begin) / 2;
if (begin <= end) {
if (key == arr[mid])
return mid;
if (key > arr[mid])
return find(key, arr, mid + 1, end);
else if (key < arr[mid])
return find(key, arr, begin, mid - 1);
}
return -1;
}