算法描述
- 前提:有已排序数组 A(假设已经做好)
- 定义左边界 L、右边界 R,确定搜索范围,循环执行二分查找(3、4两步)
- 获取中间索引 M = Floor((L+R) /2)
- 中间索引的值 A[M] 与待搜索的值 T 进行比较
① A[M] == T 表示找到,返回中间索引
② A[M] > T,中间值右侧的其它元素都大于 T,无需比较,中间索引左边去找,M - 1 设置为右边界,重新查找
③ A[M] < T,中间值左侧的其它元素都小于 T,无需比较,中间索引右边去找, M + 1 设置为左边界,重新查找 - 当 L > R 时,表示没有找到,应结束循环
package com.unit.binarySearch;
import java.util.Arrays;
/**
*ClassName:BinarySearch
*Package:PACKAGE_NAME
*Description:二分法查找 注意:数组需要排序好,且防止整数溢出问题 O(1)
*@author 程文旭
@create -08-06 14:51
*/
public class BinarySearch {
public static void main(String[] args) {
int[] array = {1, 5, 8, 11, 19, 22, 31, 35, 40, 45, 48, 49, 50};
int target = 47;
//数组排序
Arrays.sort(array);
int idx = binarySearch(array, target);
System.out.println(array[idx]);
}
//二分法查找,找到返回元素索引,找不到返回-1
public static int binarySearch(int[] arr,int goal){//goal目标值
int left = 0,rigth = arr.length-1,middle;
while (left <= rigth) {
middle = (left+rigth)/2;
if (arr[middle] == goal){
return middle;
}else if (arr[middle] >goal){
rigth = middle-1;
}else {
left = middle+1;
}
}
return -1;
}
}
整数溢出
package com.unit.binarySearch;
/*
整数溢出
*/
public class IntegerOverflow {
public static void main(String[] args) {
int l = 0;
int r = Integer.MAX_VALUE - 1;
//方法二
int m = (l + r) >>> 1;
System.out.println(m);
// 在右侧
l = m + 1;
m = (l + r) >>> 1;
System.out.println(m);
System.out.println(126 + 63);
System.out.println((126 + 63)/2);
System.out.println((126 + 63)>>>1);
}
//方法一
private static void method1() {
int l = 0;
int r = Integer.MAX_VALUE - 1;
int m = l + (r - l) / 2; // l/2 + r/2 ==> l + (-l/2 + r/2) ==> l + (r-l)/2
System.out.println(m);
// 在右侧
l = m + 1;
m = l + (r - l) / 2;
System.out.println(m);
System.out.println(126 + 63);
}
}