二分查找作为一个经典算法,有必要再温习一下
非递归版本:
/**
* @param arr:需要查找的有序数组
* @param left:数组的左边界
* @param right:数组的右边界
* @param key:需要查找的key
* @return: 返回找到的下标,找不到返回-1
*/
public static int binarySearch1(int[] arr, int left, int right ,int key) {
while ( left < right ) {
int mid = (left + right) / 2;
if (key < arr[mid]) {
right = mid - 1;
} else if (key > arr[mid]) {
left = mid + 1;
}else{
return mid;
}
}
return -1;
}
递归版本:
/**
* @param arr:需要查找的有序数组
* @param left:数组的左边界
* @param right:数组的右边界
* @param key:需要查找的key
* @return: 返回找到的下标,找不到返回-1
*/
public static int binarySearch(int[] arr, int left, int right ,int key) {
// 递归结束条件
if (left >= right) {
return -1;
}
int mid = (left + right) / 2;
if (key < arr[mid]) {
return binarySearch(arr, left, mid - 1, key);
} else if (key > arr[mid]) {
return binarySearch(arr, mid + 1, right, key);
} else {
return mid;
}
}
测试主函数
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 6, 8};
System.out.println(binarySearch(arr, 0, arr.length - 1, 3));
System.out.println(binarySearch1(arr, 0, arr.length - 1, 3));
}