【问题标题】:Binary Search Java二进制搜索 Java
【发布时间】:2015-02-26 08:07:36
【问题描述】:

我正在做一个项目,它从 .txt 文件中读取书名并将它们放入 arraylist,然后将 arraylist 转换为数组,用户输入一个数字,即书籍参考号,然后它进行线性搜索和二分搜索以找到那本书。我只是对二进制搜索的代码有问题,因为我几乎不知道该怎么做,这就是我所拥有的:

   private void FindItActionPerformed(java.awt.event.ActionEvent evt) {                                       
String input;

input = Input.getText();

for(int i=0; i<bookList.length; i++){
if (bookList[i].referenceNumber.equals(input)){
    Output1.setText("The Book is " + bookList[i].title);
}
}

上面是线性搜索的代码,效果很好。下面是我认为我需要进行二分搜索的内容,但同样,我不确定也无法弄清楚。

int right = 0, left = bookList.length;
while(right<= left){
    int middle = (right + left)/2;
    if( bookList[middle].referenceNumber.equals(input)){
        Output2.setText("The book is " + bookList[middle].title);     
    }
}

}    

这是类和数组

 public class Book{
String referenceNumber, title;

public Book(String _referenceNumber, String _title){
   referenceNumber = _referenceNumber;
   title = _title;
}
}

 ArrayList <Book> Books = new ArrayList <Book> ();
 Book [] bookList;

感谢您提供的任何帮助,这对我来说有点棘手。

【问题讨论】:

标签: java binary-search


【解决方案1】:

我在学习二进制搜索编码时也遇到了问题。您应该知道的第一件事是,您不必进行二分搜索和线性搜索,您只需要做其中一个即可。另外要进行二进制搜索,您需要对数组进行排序 ex int[] array = {1,2,3,4,5,6,7,8,9,10}; 二进制搜索的作用是查看数组中的中间元素并测试该元素是否大于或小于键。如果它小于所有内容,则忽略中间元素(对于更大的内容相同,只是所有更大的内容都被丢弃)。然后选择一个新的中间元素并丢弃一半,直到找到键为止。下面是对 int 数组进行排序的代码,您需要对其进行修改以返回书籍(字符串?或您可能编写的课程书籍)

public static boolean binarySearch(int[] array, int key){
    int partition = 0;
    int right = array.length - 1;
    boolean found = false;
    int left = 0;






    while(! found && left <= right){

        if(array[partition] == key){
            found = true;
        }


    if(array[partition] > key){//key less
        right = partition - 1;
        partition = (right + left) / 2;
    }

    if(array[partition] < key){//key greater
        left = partition + 1;
        partition = (left + right) / 2;


    }



    }
    return found;

}

这里还有一些用于对整数数组进行排序的代码。这是一个冒泡排序,所以它很慢 On^2

public int[] bubbleSort(int[] array){
    int temp;
    boolean keepGoing = true;

    while(keepGoing == true){
    keepGoing = false;
        for(int i=0; i < array.length - 1; i++){
        if(array[i] > array [i + 1]){ //if i < i + 1 means greatest to smallest if 
                                        // if i > i + 1 means smallest to greatest
            swap(array, i, i + 1);
            keepGoing = true;

        }
    }
    }


    return array;

    }

代码很简单,必须修改它才能对您的书籍进行排序,方法如下所示

public int[] swap(int[] array, int i, int j){
    int temp = 0;
    temp = array[i];
    array[i] = array[j];
    array[j] = temp;
    return array;
}

【讨论】:

    【解决方案2】:

    二分搜索的可视化效果很好 http://balance3e.com/Ch8/search.html 例如尝试进入 FL 并观察算法一步一步地寻找它。 你会很快得到它:)

    它的工作原理就像在字典中查找一个单词...例如,您正在寻找“猫”, 所以你把字典打开一半,看到“man”这个词在字典上比“cat”大,所以你会在字典的前半部分从“man”=向左看...

    然后你只需重复这个分割成更小的部分的过程,直到你找到你要找的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多