首先,我需要计算当查找数字大于“登陆”数字时。 (少了,我可以使用/ 2,但我不知道该怎么办,因为我使用的是int而不是双倍。)
其次我遇到一个越界错误,我不知道原因。
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.JOptionPane;
public class BinärSökning {
public static void main(String[] args){
ArrayList<Integer> listA = new ArrayList<Integer>();
Integer[] otherList = new Integer[] {1,2,3,4,5,6,7,8,9,10};
listA.addAll(Arrays.asList(otherList));
String lts = JOptionPane.showInputDialog("Which number between 1 and 10 are you looking for? ");
int lt = Integer.parseInt(lts);
int s = listA.size()/2;
while(true){
if(lt==listA.get(s)){
System.out.println("Number found in position " + s);
}if(lt<listA.get(s)){
s = ???;
}else{
s = s/2;
}
}
}
}
答案 0 :(得分:1)
二进制搜索的算法并不像你写的那样。 这是谷歌的第一个结果: http://algs4.cs.princeton.edu/11model/BinarySearch.java.html
答案 1 :(得分:0)
以下是您使用从George提到的链接中获取的正确二进制搜索算法改进的代码。
int lo = 0;
int hi = listA.size - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (lt < listA.get(mid)) {
hi = mid - 1;
} else if (lt > listA.get(mid)) {
lo = mid + 1;
} else {
System.out.println("Number found in position ", mid);
}
}
该算法将排序的数字数组减半,具体取决于mid
处的数字是大于还是小于输入值lt
。此外,如果在排序数组中找不到用户输入,则应提供一些错误处理。