【问题标题】:Java BinarySearch programJava BinarySearch 程序
【发布时间】:2016-03-19 12:32:36
【问题描述】:

我正在学习 Java 编程并制作了一个程序,该程序使用 Binary Searchchar 数组中查找 symbol。但是,当我尝试在 array 中搜索 notsymbol 时遇到问题,我的程序变成了无限循环。如果数组中没有这样的符号,我不知道如何制作错误符号。这是我的程序的代码

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);
    }
}

提前谢谢你。

【问题讨论】:

  • 逐步调试调试器以查找未更改的内容。注意:如果mid == last/2 这不会改变任何东西。
  • 您隐含地假设您的搜索下限的索引始终为 0。请查看任何好的教科书或互联网上对“二分搜索”的描述。
  • @PeterLawrey 似乎last=midmid=last/2 之前避免了“不会改变任何东西”。但没有first 毁了表演。

标签: java arrays sorting search


【解决方案1】:

如果 case 不正确,您将无法跳出 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 ");
}

这很好,也许你应该使用这个方法。

【讨论】:

    【解决方案2】:

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

    以下是仅使用 lastmid 变量的解决方案,根据您上面的代码要求:

    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!!");
        }
    

    【讨论】:

      【解决方案3】:

      要在 char 数组中查找符号,您可以使用 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.
      

      了解更多请参考>>binary search algorithm

      【讨论】:

      • 他想知道他的代码有什么问题。这个答案没有解决这个问题
      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 2020-07-26
      相关资源
      最近更新 更多