Java递归——二分查找问题
二分查找
前提:查找的数组必须是有序的
查找过程:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
图解:
代码如下
package Ivan.Search;
import java.util.*;
//使用二分查找的前提是该数组是有序的
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1, 3, 4, 5, 6, 7, 3, 34, 44, 5, 6, 7, 89, 23, 34, 6, 72, 60};
Arrays.sort(arr);
int temp = binarySearch(arr, 43, 0, arr.length - 1);
System.out.println(temp);
}
//二分查找算法
/**
* @param arr 需要查找的数组
* @param n 需要查找的值
* @param left 左边界
* @param right 右边界
* @return 找到返回下标,没找到返回-1
*/
public static int binarySearch(int[] arr, int n, int left, int right) {
if (n < arr[left] || n > arr[right] || left > right) { //判断是否越界
return -1;
}
int mid = (left + right) / 2;
int midValue = arr[mid];
if (midValue < n) {
return binarySearch(arr, n, mid + 1, right);
} else if (midValue > n) {
return binarySearch(arr, n, left, mid - 1);
} else {
return mid;
}
}
}