二进制搜索算法无法正常工作 - Java

时间:2013-04-29 14:20:16

标签: java algorithm search binary do-while

我想制作自己的二进制搜索算法来搜索1 000 000个元素的ArrayList。我决定用do-while循环进行搜索。我知道我可以使用while()循环。但是当我运行它时,需要很长时间才能找到这个数字。我想设置ArrayList的第一个和最后一个元素的值有问题。我的代码是

import java.util.*;

public class BinSearchAlg {
public static void main(String[]args){

    int first;
    int last;
    int median;//middle element of arraylist
    Long element;//element with median index
    Scanner scan = new Scanner(System.in);
    ArrayList<Long>list = new ArrayList();
    for(long l=0;l<1000000;l++){
        list.add(l);//list is sorted
    }
    first = 0;
    last = list.size();
    median = (last-first)/2;
    element = list.get(median);
    System.out.println("Choose the number: ");
    long l = scan.nextLong();
    do{
        if(element<l){
            first = median;
            median=(last-first)/2;
            element = list.get(median);
        }else{ //if(element>l){
            last = median;
        median = (last-first)/2;
        element = list.get(median);
        }
    }while(element!=l);
}
}

谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

median计算存在问题:

median=(last-first)/2;

你应该这样做:

median=(last+first)/2;

在当前的代码中,当您在[10..16]范围内搜索时,您的代码会尝试将目标与list.get(3)的中位数进行比较。

可能还有另一个错误,但是现在我会告诉你这个。提示:尝试[0, 1],这应该暴露代码中的错误。

答案 1 :(得分:0)

由于紫薇薇回答,你需要修正中位数。此外,您可能需要一个不同的循环退出条件 - 如果l不在列表中,您现在已经有了无限循环。此外,您的if-else必须是if-elseif-else - 目前如果l == element,那么循环实际上会将其视为element > l并继续循环播放。

答案 2 :(得分:0)

你可以直接使用Collection类的二进制搜索方法提供java.util包: -

Collections.binarySearch(myList,key.get(i),new MyTransferObjectClass());

public class MyTransferObjectClass implements Comparator<MyTransferObjectClass>{

@Override
    public int compare(MyTransferObjectClass o1, MyTransferObjectClass o2) {
                //your logic for comparison
    }

}

为什么在可以使用可用API时添加冗余代码。