package com.example.javastudy.arithmetic;
import java.util.Arrays;
import java.util.List;
public class BinarySearch {
public static void main(String[] args) {
/**
* 二分查找功能:
* 前提:数组从小到大有序排序的
* 实现逻辑:从数组查询数据,通过先查找中间的位置(2),根据中间位置的值(2)和查找值(4)相比判断找中间值右边的数据,继续从右边中间值找,从而更快的查找到数据
* 实现细节:
* 获取最左边界(0)和最右边界(长度-1=5)
* 获取中间(索引位置2)
* 相等则等于找到了,返回索引,遍历后没有相等的返回-1
* 如果目标值(4)大于中间值,说明数在右边,把最左边界改为中间值+1(2+1=3,这时最左边界为3最右边界为5)
* 如果目标值小于中间值,说明数在做边,把最右边界改为中间值-1.
* 注意事项:
* 1.获取平均值时长度为偶数(6),则取两个值的前面那个(2)
* 2.获取中间值用(l+r)/2,当l+r大于Integer最大值时,会成为负数,所以用>>>无符号右移
*/
List<Integer> integers = Arrays.asList(0, 1, 2, 3, 4, 5);
int target = 3;
System.out.println(binarySearch(integers, target));
}
private static int binarySearch(List<Integer> integers, int target) {
int l = 0;
int r = integers.size() - 1;
int m;
while (l <= r) {
// 为了防止l+r超过Integer的最大数导致变成负数,选择无符号右移
m = (l + r) >>> 1;
Integer mValue = integers.get(m);
if (target == mValue) {
return m;
} else if (target > mValue) {
l = m + 1;
} else {
r = m - 1;
}
}
return -1;
}
}
二分查找法Demo
最新推荐文章于 2024-07-15 22:27:12 发布