Java二进制搜索程序
我正在学习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){
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
似乎避免了“不会改变任何东西”。但是没有第一个会破坏性能。他想知道他的代码中有什么问题。这个答案不能解决这个问题