当数组有奇数值时如何使用二进制搜索?

时间:2017-10-22 05:58:08

标签: java arrays algorithm binary-search

我正在使用binarySearch并且它对具有偶数索引的数组运行良好,但是当数组具有奇数索引(长度)时,它会给出错误的结果。

我做了什么这样的票价:

public static int binarySearch(int[] list, int key) {

    int low = 0;
    int high = list.length - 1;
    while (high >= low) {
        int mid = (low + high) / 2;

        if (key < list[mid])
            high = mid - 1;
        else if (key == list[mid])
            return mid;
        else
            low = mid + 1;

    }
    return - 1;
}

输入:

int[] arr1 = {5, 6, 8, 9, 11, 12, 11, 50, 1, 3, 15, 121, 33, 16, 17, 18, 19};
int[] arr2 = {5, 6, 8, 9, 11, 12, 11, 50, 1, 3, 15, 121, 33, 16, 17, 18};

案例:

System.out.println(binarySearch(arr1, 12));
System.out.println(binarySearch(arr2, 12));

输出:

-1
5

在这两种情况下我怎样才能得到正确的出局?

2 个答案:

答案 0 :(得分:1)

在进行二进制搜索操作之前,必须对数组进行排序。

在您的问题中,您无法搜索奇数阵列长度。

在java中很容易。

您可以使用以下代码。

&#13;
&#13;
import java.util.Arrays;
 
class BS 
{
  public static void main(String args[])
  {
        int[] arr1 = {5, 6, 8, 9, 11, 12, 11, 50, 1, 3, 15, 121, 33, 16, 17, 18, 19};
 
        System.out.println(Arrays.binarySearch(arr1 , '12'));
  }
}
&#13;
&#13;
&#13;

答案 1 :(得分:1)

二进制搜索仅适用于已排序的数组

解决方案:添加Arrays.sort(list)

public static int binarySearch(int[] list, int key) { 
    Arrays.sort(list);
    int low = 0;
    int high = list.length - 1;
    while (high >= low) {
        int mid = (low + high) / 2;
        if (key < list[mid]) high = mid - 1;
        else if (key == list[mid]) return mid;
        else low = mid + 1;
    } return - 1;
}