public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
test();
}
}
private static void test() {
// 1、获取一个有序数组
int i = ThreadLocalRandom.current().nextInt(100);
int[] ints = ArraysUtils.getInts();
Arrays.sort(ints);
System.out.println("需要查找的数" + i);
System.out.println(Arrays.toString(ints));
// 2、定义左右边界
int left = 0;
int right = ints.length - 1;
// 3、定义终止条件,如果是<,当数的位置在索引0的时候,可能会出现left=0;right=0的情况,导致查找不到
while (left <= right) {
// 3.1 二分取中间值
int middle = (left + right) / 2;
int tmp = ints[middle];
// 3.2 根据二分的中间值来分支,等于则找到,中间值大于查找值,则将范围往左移,剔除中间值这个位置;中间值小于查找值,则剔除中间值位置后往右切割
if (tmp == i) {
System.out.println("索引位置:" + middle);
return;
} else if (tmp > i) {
// -1是剔除中间值,由于是把右边界左移,所以是-1
right = middle - 1;
} else {
// +1是剔除中间值,由于是把左边界右移,所以是+1
left = middle + 1;
}
}
System.out.println("没找着");
}