我需要使用二进制搜索来定位数组中的45.3。这是我到目前为止所拥有的。
public class Bsearch {
public static final int NOT_FOUND = -1;
public static int binarySearch(int[] a, int x) {
int low = 0;
int high = a.length - 1;
int mid;
while (low <= high) {
mid = (low + high) / 2;
if (a[mid].compareTo(x) < 0)
low = mid + 1;
else if (a[mid].compareTo(x) > 0)
high = mid - 1;
else
return mid;
}
return NOT_FOUND;
}
public static void main(String[] args) {
int SIZE = 6;
int[] a = new Integer[SIZE] = { 10, -3, 5, 24, 45.3, 10.5 };
System.out.println("45.3 Found" + binarySearch(a, 45.3));
}
}
我所有的错误似乎都来自这个领域 -
int [] a = new Integer [ SIZE ]={ 10,-3,5,24,45.3,10.5 };
System.out.println("45.3 Found" +binarySearch(a, 45.3));
这一切对我来说都是新的,对任何明显的错误都很抱歉。
答案 0 :(得分:1)
问题确实在这一行:
int[] a = new Integer[SIZE] = { 10, -3, 5, 24, 45.3, 10.5 };
有很多问题:
Integer[]
分配给int[]
变量。将其更改为new int[]
new
运算符创建新数组时,您可以指定数组的大小或内容。所以:
int[] a = new int[SIZE];
或者
int[] a = new int[] { 10, -3, 5, 24, 45, 10 };
两者都有效。
您必须决定是否要使用类包装器(int
)的原始类型(Integer
)并坚持使用它。
您的方法binarySearch
会将int[]
作为参数,但您使用的方法(compareTo
)只能在Integer
上使用。
但实际上,比较原始类型要简单得多:
if (a[mid] < x)
low = mid + 1;
else if (a[mid] > x)
high = mid - 1;
else
return mid;
答案 1 :(得分:1)
对于二进制搜索,数据数组应该排序,并按正确的顺序排序,但是传递给binarySearch(int [] a,int x)的数组没有排序,所以首先对数组进行排序然后应用二进制搜索它。 还要检查二进制搜索的逻辑,你将中间元素与0进行比较,它应该与要搜索的元素进行比较(键)
while(high >= low) {
int middle = (low + high) / 2;
if(data[middle] == key) {
return true;
}
if(data[middle] < key) {
low = middle + 1;
}
if(data[middle] > key) {
high = middle - 1;
}
}