二分查找法使用条件
- 使用时数组必须是有序数组
原理
- 通过下标得到数组内元素间相对的大小关系,定义三个变量:两个边界变量确定查找范围,一个取值两个边界变量中间值的中间变量用于同被查找值比较大小、从而改变边界变量的值进而缩小查找区间的范围、重新确定中间值,并重复这一过程直到中间值下标等于查找值、最小值下标大于最大值下标,退出循环。
public static void main(String[] args) {
int arr[] = {1,2,3,4,5,6,7,8,9,10};
System.out.println(binarySearch(arr, 23));
}
public static int binarySearch(int[] arr,int key){
//数组查询区间开始索引
int head = 0;
//数组查询区间结尾索引
int end = arr.length - 1;
//开始索引小于结尾索引,当开始索引大于于结尾索引时循环结束,则表明该元素不存在。
while (head <= end) {
//求要查找的数组区间的中间元素的索引
int mid = (head + end) / 2;
if (arr[mid] > key) {
//如果这次查询的区间中间元素值大于要查找的值,
//则下一次循环查询区间的结尾等于这次中间元素值的索引-1,往左缩小查询区间。
end = mid-1;
} else if (arr[mid] < key) {
//如果这次查询的区间中间元素值小于要查找的值,
//则下一次循环查询区间的开头等于这次中间元素值的索引+1,往右缩小查询区间。
head = mid+1;
} else {
//存在则返回元素索引
return mid;
}
}
//不存在返回-1
return -1;
}
运行效果:当查找 2 时,查找到后返回该元素的索引。
运行效果:当查找 11 时,因为该元素不存在数组里,则返回-1。