前提
数组必须是有序的
算法描述
- 有一个有序数组 A
- 定义算法的左右边界,分别为 L 和 R, 循环执行二分查找。
- 获取中间索引 M = (L + R) / 2
- 中间索引的值与待查找的值 T 进行比较
- 中间索引的值 A[M] 与带查找的值 T 进行比较
- 4.1 A[M] = T 表示找到,返回中间索引
- 4.2 A[M] > T 中间值右侧的其它元素都大于 T, 无需比较,去中间索引左边去找,M-1 设置为右边界,重新查找
- 4.3 A[M] < T 中间值左侧的其它元素都小于 T, 无需比较,去中间索引右边去找,M-1 设置为左边界,重新查找
- 当 L > R 时,表示没有找到,应结束循环
算法实现
private static int binarySearch(int[] arr, int target){
int left = 0, right = arr.length - 1, mid;
while (left <= right) {
mid = left + (right -left)/2;//(left+ right) >>> 1
if(arr[mid] == target) {
return mid;
} else if(arr[mid] > target) {
right = mid - 1;
} else if(arr[mid] < target) {
left = mid + 1;
}
}
return -1;
}
public static void main(String[] args) {
int a[] = { 0,1,2,3,4,5};
System.out.println(binarySearch(a,4));//4
}