使用二进制搜索在数组中查找值(Java)

时间:2015-03-20 04:11:47

标签: java search binary

我需要使用二进制搜索来定位数组中的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));

这一切对我来说都是新的,对任何明显的错误都很抱歉。

2 个答案:

答案 0 :(得分:1)

问题确实在这一行:

int[] a = new Integer[SIZE] = { 10, -3, 5, 24, 45.3, 10.5 };

有很多问题:

  1. 您无法将Integer[]分配给int[]变量。将其更改为new int[]
  2. 您不能将浮点数放在整数数组中;将您的数字45.3和10.5更改为整数。
  3. Java中有两个选项:当您使用new运算符创建新数​​组时,您可以指定数组的大小或内容。
  4. 所以:

    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;
  }
}