Java二进制搜索程序

Java二进制搜索程序,java,arrays,sorting,search,Java,Arrays,Sorting,Search,我正在学习Java编程,并制作了一个程序,它使用二进制搜索在字符数组中查找符号。但是,当我试图在数组中搜索符号而不是时,我遇到了一个问题,我的程序变成了一个无休止的循环。如果数组中没有这样的符号,我不知道如何生成错误符号。这是我的程序代码 import java.lang.reflect.Array; import java.util.Arrays; public class Main { public static void main(String[] args){

我正在学习Java编程,并制作了一个程序,它使用二进制搜索字符数组中查找符号。但是,当我试图在数组中搜索符号而不是时,我遇到了一个问题,我的程序变成了一个无休止的循环。如果数组中没有这样的符号,我不知道如何生成错误符号。这是我的程序代码

import java.lang.reflect.Array;
import java.util.Arrays;

public class Main {
    public static void main(String[] args){
        char[]arr = {'a','d','f','l','o','z'};
        find(arr,'m');

    }
    public static void find(char[]arr,char ch){
        int last = arr.length-1;
        int mid=last;
        while (arr[mid] != ch){
            if (arr[mid]<ch){
                mid = (last+mid)/2;
            }
            else{
               last=mid;
                mid=last/2;
            }
        }
        System.out.print(mid);
    }
}
import java.lang.reflect.Array;
导入java.util.array;
公共班机{
公共静态void main(字符串[]args){
char[]arr={'a','d','f','l','o','z'};
查找(arr,'m');
}
公共静态void find(char[]arr,char ch){
int last=arr.length-1;
int mid=最后一个;
while(arr[mid]!=ch){

if(arr[mid]您没有理由中断while循环,并且在2个if情况下分配给变量的更改值不正确。此外,您还应该检查在if-else梯形图中找到元素的时间,并使用变量(find)指示是否找到该元素。此外,最好使用3个变量作为下限(第一个)、中间和上限(最后一个)。下面的代码是find()方法的修订版

public static void find(char[]arr,char ch){
    int first=0,mid=0,last=arr.length-1,found=0;
    while (first<=last){
        mid=(last+first)/2;
        if(arr[mid]==ch){
            System.out.print(ch+" found at index "+mid);
            found=1;
            break;
        }
        else if(arr[mid]<ch){
            first=mid+1;
        }
        else if(arr[mid]>ch){
           last=mid-1;
        }
    }
    if(found==0)
    System.out.print(ch+" was not found ");
}
publicstaticvoidfind(char[]arr,charch){
int first=0,mid=0,last=arr.length-1,found=0;

while(首先您必须对
find()
方法进行一些更改。首先检查
mid
的值不应超过
last
的值,因此您必须相应地更改while循环条件。其次,您必须给出终止条件
if(arr[mid]==ch)
才能退出循环。 这也可以通过使用两个易于理解和实现的变量
lo
hi
来实现。请参见此处的实现

以下是根据上述代码要求,仅使用
last
&
mid
变量的解决方案:

public static void find(char[]arr,char ch){
        int last = arr.length-1;
        int mid=last/2;
        while (mid<=last){
            if(arr[mid] == ch) //if found, Print and exit the loop
            {
                System.out.println("found at:"+mid);
                return;
            }

            if (arr[mid]<ch){
                mid=((last+mid)/2)+1;
            }
            else{
                last=mid-1;
                mid=last/2;
            }
        }
        System.out.println("Not found!!");
    }
publicstaticvoidfind(char[]arr,charch){
int last=arr.length-1;
int mid=最后一个/2;

而(mid要在字符数组中查找符号,可以使用
Arrays
类的
binarySearch
方法

语法:

Arrays.binarySearch(a, key);
例如:

char[] arr = {'a','d','f','l','o','z'};
如果要搜索不在数组中的字符或符号,输出将是-1,如下所示

System.out.println("The char 'b' is at index : " + Arrays.binarySearch(arr, 'b') + ".");
输出将是:

The char 'b' is at location : -1.

要了解更多信息,请参阅>>。

逐步通过调试器查找未更改的内容。注意:如果
mid==last/2
这不会更改任何内容。您隐式假设搜索下限的索引始终为0。请检查“二进制搜索”的说明在任何好的教科书或互联网上。@PeterLawrey在
mid=last/2
之前的
last=mid
似乎避免了“不会改变任何东西”。但是没有
第一个
会破坏性能。他想知道他的代码中有什么问题。这个答案不能解决这个问题