二分查找

import java.util.Arrays;

/**
* 二分查找
*/
public class BinarySearch {
public static void main(String[] args) {
// 定义要进行查找的数组
int[] arr = new int[]{1,2,3,4,5,77,55,44,22,89,67,111,6};
// 定义查找的目标数
int target = 55;
// 要进行二分查找的数组必须进行排序
// 因为二分查找是根据数组长度的中间索引位置的值来进行判断
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
// 调用二分查找的方法
System.out.println(binarySearch(arr, target));

}
// 定义二分查找的方法
public static int binarySearch(int[] arr,int target) {
// 定义左、右边界和中间位置的索引
int l = 0,r = arr.length - 1,m;
// 循环进行查询
while (l <= r) {
// 获取数组中间位置的元素
//----------------------------第一种-----------------------------------//
// m = (l+r)/2; // 缺点: 数据可能会溢出而报异常
//----------------------------第二种-----------------------------------//
// l+(r-l)/2 与 (l+r)/2 的结果一致,但是当l与r的值都很大时,l+r可能会导致超出整数的最大值,而 l+(r-l)/2可以避免整数溢出
// m = l + (r-l) / 2;
//----------------------------第三种-----------------------------------//
// 因为程序底层是二进制机器码,所以使用位运算效率更高
m = (l + r) >>> 2;
// 如果中间位置的索引的值和目标值一致,返回中间位置的索引
if (arr[m] == target) {
return m;
} else if (arr[m] < target) {
// 如果中间位置的索引的值小于目标值,说明此时中间位置的左边都是小于目标数的元素;则缩小查询区间 使 左边界 = 中间位置索引 + 1
l = m + 1;
} else if(arr[m] > target) {
// 如果中间位置的索引的值大于目标值,说明此时中间位置的右边全是大于目标数的元素;则缩小查询区间 使右边界 = 中间位置索引 - 1
r = m - 1;
}
}
// 若没有查询到则返回 -1
return -1;
}
}
posted @ 2022-12-29 15:28  不凡34  阅读(33)  评论(0)    收藏  举报