二分查找算法
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1, 3, 8, 10, 11, 67, 100};
int target = -100;
//int index = binarySearchNoRecursion(arr, target);
int index = binarySearchWithRecursion(arr, target);
if (index != -1) {
System.out.printf("待查找的数字 %d 找到了,索引为 %d \n", target, index);
} else {
System.out.println("未找到");
}
}
/**
* 二分查找的非递归实现
*
* @param arr 待查找的数据-升序数组
* @param target 待查找的数
* @return 返回对应的下标,-1表示没有找到
*/
public static int binarySearchNoRecursion(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) { // 可以继续查找
int mid = (left + right) / 2;
if (target == arr[mid]) {
return mid;
} else if (target < arr[mid]) {
// 到mid的左半边进行查找
right = mid - 1;
} else {
// 到mid 的右半边进行查找
left = mid + 1;
}
}
return -1;
}
// 二分查找的递归实现方法重载
public static int binarySearchWithRecursion(int[] arr, int target) {
if (arr != null) {
return binarySearchWithRecursion(arr, 0, arr.length - 1, target);
}
System.out.println("待查数组为空...");
return -1;
}
/**
* 二分查找的递归实现
*
* @param arr // 待查找的数组-升序
* @param left // 当前查找范围的最左端
* @param right // 当前查找范围的最右端
* @param num // 待查找数字
* @return // 返回下标,没有找到返回-1
*/
public static int binarySearchWithRecursion(int[] arr, int left, int right, int num) {
int mid = (left + right) / 2;
int midValue = arr[mid];
if (left > right) {
return -1;
}
if (num > midValue) { // 向右递归
return binarySearchWithRecursion(arr, mid + 1, right, num);
} else if (num < midValue) { // 向左递归
return binarySearchWithRecursion(arr, left, mid - 1, num);
} else {
return mid;
}
}
}