我想制作自己的二进制搜索算法来搜索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);
}
}
谢谢你的帮助。
答案 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时添加冗余代码。