我正在学习Java编程并制作了一个程序,该程序使用二进制搜索在 char 数组中查找符号。但是,当我尝试在数组中搜索符号 时,我遇到了问题,我的程序变成了无休止的循环。如果数组中没有这样的符号,我不知道如何制作错误符号。这是我的程序代码
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);
}
}
提前谢谢。
答案 0 :(得分:0)
如果情况不正确,则无法突破while循环以及在2期间分配给变量的更改值。另外,您还应该检查if-else梯形图中何时找到元素,并使用变量(found)来指示是否找到该元素。此外,如果你使用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 ");
}
这很好用,也许你应该使用这种方法。
答案 1 :(得分:0)
您必须在find()
方法中进行一些更改。首先检查mid
的值是否永远不会超过last
的值,因此您必须更改while循环条件因此。其次,你必须给出一个终止条件if(arr[mid]==ch)
来循环。
这也可以通过使用两个变量lo
&amp; hi
,易于理解&amp;实现。请参阅此处的实施Binary Search。
以下解决方案仅使用last
&amp; 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!!");
}
答案 2 :(得分:-2)
要在char数组中查找符号,您可以使用binarySearch
类的Arrays
方法。
语法:
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.
了解更多参考&gt;&gt; binary search algorithm