我试图在ArrayList上执行 递归 二进制搜索,但不确定我的代码是什么问题。我有一个带有一堆整数的文本文件,如下所示:
217 320 550 212 12 17 3560 2999 211
问题是当我输入一个数字来搜索ArrayList时,它总是说该元素不存在,但我知道它确实存在!
public static int binarySearch(List<Integer> arr, Integer l, Integer r, Integer x)
{
if (r>=l)
{
Integer mid = l + (r - l)/2;
// If the element is present at the middle itself
if ((arr.size()/2) == x)
return mid;
// If element is smaller than mid, then it can only
// be present in left subarray
if ((arr.size()/2) > x)
return binarySearch(arr, l, mid-1, x);
// Else the element can only be present in right
// subarray
return binarySearch(arr, mid+1, r, x);
}
// We reach here when element is not present in array
return -1;
}
}
任何帮助都会非常感谢,新程序员在这里!
答案 0 :(得分:2)
检查元素是否存在的部分是错误的,不要这样做:
arr.size()/2 == x
arr.size()/2 > x
相反,这样做:
arr.get(mid) == x
arr.get(mid) > x
因为您应该访问mid
位置的元素,而不是检查列表大小的一半是否等于x
。
答案 1 :(得分:0)
你不应该用arr.size()
或类似的东西替换arr[mid]
吗?看起来你没有比较一个项目的价值,而是数组大小本身,它是不变的,完全不相关。
答案 2 :(得分:0)
您计算mid
,然后使用arr.size() / 2
,而不是......
将其替换为arr.get(mid)
,如下所示:
public static int binarySearch(final List<Integer> arr, final int l, final int r, final Integer x)
{
if (r >= l)
{
final int mid = l + (r - l) / 2;
// If the element is present at the middle itself
if (x.equals(arr.get(mid)))
return mid;
// If element is smaller than mid, then it can only
// be present in left subarray
if (arr.get(mid) > x)
return binarySearch(arr, l, mid - 1, x);
// Else the element can only be present in right
// subarray
return binarySearch(arr, mid + 1, r, x);
}
// We reach here when element is not present in array
return -1;
}