Java实现二分法查找算法
package suanFa;
public class BinarySearchTest {
/**
* 查找:二分法,返回目标数key的索引
*
* @param args
* @return key的索引
*/
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 6, 7, 9 };
int result1 = binarySearch1(arr, 6);
int result2 = binarySearch1(arr, 1);
int result3 = binarySearch1(arr, 0);
int result4 = binarySearch2(arr, 9, 0, arr.length - 1);
int result5 = binarySearch2(arr, 10, 0, arr.length - 1);
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
System.out.println(result4);
System.out.println(result5);
}
//方法一:非递归实现(while循环)
public static int binarySearch1(int[] arr, int key) {
int low = 0; // 起始索引
int high = arr.length - 1; // 末尾索引
while (low <= high) {
int mid = (low + high) / 2; // 二分索引
if (key == arr[mid]) { // 找到目标数
return mid;
} else if (key < arr[mid]) { // 目标数在左边
high = mid - 1;
} else { // 目标数在右边
low = mid + 1;
}
}
return -1; // 没找找目标数
}
// 方法二:递归实现
public static int binarySearch2(int[] arr, int key, int low, int high) {
int mid = (low + high) / 2; // 中间索引
if (key < arr[low] || key > arr[high] || low > high) {
return -1;
}
if (key == arr[mid]) { // 找到目标数
return mid;
} else if (key < arr[mid]) { // 目标数在左边
return binarySearch2(arr, key, low, mid - 1);
} else { // 目标数在右边
return binarySearch2(arr, key, mid + 1, high);
}
}
}