java中二进制搜索代码出错

时间:2016-03-22 14:06:01

标签: java binary-search

我在java中进行二进制搜索。我希望数组和键值作为用户输入,所以我在这里使用扫描仪。

  

我已经编写了这段代码,但是当我将键值作为用户输入时,我无法理解为什么它不起作用。我知道什么是二进制搜索并且已经完成了Stack Overflow上的其他问题,但我的是编码如果有人可以提供帮助,我无法弄清楚的问题。我的代码是:

//Program for getting a key value doing Binary Search
import java.util.Scanner;

public class Bin_Search{

public static void main(String[] args)
{
    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    int a[] = new int[n];
    for(int i =0; i<n; i++)
        a[i]= scan.nextInt();
    for(int i =0; i<n; i++)
        System.out.print(a[i] + " ");
    System.out.println("Enter the value you want to find");
    int key = scan.nextInt();
    Bin_Search bin = new Bin_Search();
    System.out.println("position is" + bin.b_search(a,key));
}

//Method to perform binary search
public int b_search(int arr[], int key)
{
    int n = arr.length-1;
    int lo = 0;
    int hi = n-1;
    int mid = (lo+hi)/2;
    while(lo<=hi)
    {
        if(a[mid]>key)
            hi = mid-1;
        else if(a[mid]<key)
            lo = mid+1;
        else 
            return mid;
    }
    return -1;
}
}

1 个答案:

答案 0 :(得分:4)

你永远不会改变mid,你将在无限循环中检查数组中的相同位置。您需要在循环的每次迭代中更改它

while(lo<=hi)
{
    if(a[mid]>key)
        hi = mid-1;
    else if(a[mid]<key)
        lo = mid+1;
    else 
        return mid;

    mid = (lo+hi)/2;
}

顺便说一下,你错过了数组中的最后一项

int n = arr.Length - 1;
int hi = n - 1;

方法hi实际上是arr.Length - 2。只是做

int hi = arr.Length - 1;