/**
* TODO : 二分查找法 : 针对有序数组
* 条件 : 在一组有序的数组中查询是否有该数数字
* 遍历整个数组 一一对应 也可以查询到 但是这样效率会随着数组长度增加而越来越慢
* 相对而言 我们可以使用二分查找法 会大大提高查询效率 <其有一个缺点 就是数组必须是有序的>
* 1. 拆分数组 取中间的值比较大小 如此 查找区间就会缩小一半
* 2. 然后继续之前的操作 在属于的区间继续拆分查找 直到找到该元素 或者数组长度为0时(什么没有该元素的存在)
*/
@Test
void test9() {
int[] array = {6, 8, 22, 26, 36, 44, 55, 68, 79, 88, 89, 91, 99};
int search = search(array, 91);
System.out.println(search);
int recursive = recursive(array, 0, array.length - 1, 91);
System.out.println(recursive);
}
//简单循环实现 (存在该元素则返回该元素的索引下标)
int search(int[] arr, int value) {
//定义中间元素下标
int low = 0;
int high = arr.length - 1;
while (low <= high) {
int min = low + (high - low) / 2;
if (arr[min] == value) {
//当值相等 则返回数组下标
return min;
} else if (arr[min] < value) {
//值小于传入的元素 则说明该元素在数组的右面
low = min + 1;
} else {
//否则在左边
high = min - 1;
}
}
return -1;
}
//递归实现
int recursive(int[] arr,int low,int high,int value){
if (low > high) return -1;
int min = low + (high - low) / 2;
if (arr[min] == value) {
return min;
} else if (arr[min] < value) {
return recursive(arr, min+1, high, value);
} else {
return recursive(arr, low, min-1, value);
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交