BinarySearch在列表中找不到元素,即使它是';那里有:Java
有人能指出我哪里出了问题吗?我用一个调试器进行了调试,看起来我的算法应该找到搜索键,但不是。(为了检查,我打印了'foundat index',然后是[sorted]列表的内容;我搜索的元素123在列表中,但返回了'not found'值-1。)BinarySearch在列表中找不到元素,即使它是';那里有:Java,java,algorithm,binary-search,Java,Algorithm,Binary Search,有人能指出我哪里出了问题吗?我用一个调试器进行了调试,看起来我的算法应该找到搜索键,但不是。(为了检查,我打印了'foundat index',然后是[sorted]列表的内容;我搜索的元素123在列表中,但返回了'not found'值-1。) public int-binarySearch(数组列表,int键){ int foundAtIndex=-1; int midPoint=list.size()/2; int midPointValue=list.get(中点); 如果(list.s
public int-binarySearch(数组列表,int键){
int foundAtIndex=-1;
int midPoint=list.size()/2;
int midPointValue=list.get(中点);
如果(list.size()>1){
如果(中点值==键){
foundAtIndex=中点;
}
否则如果(中点值>关键点){
ArrayList newList=新的ArrayList();
对于(int i=0;i
编辑:好的,它现在找到了,但我的问题是我需要返回它在原始数组中找到的索引。实际上,它缩小了范围,然后返回“newList”中元素的索引。因此,它总是以“newList”的形式返回在索引中找到的内容。换句话说,我希望返回一个实际的foundAtIndex(值在原始数组中的位置),而不是一个布尔值,“was/notfound”值。每次调用
binarySearch(newList,key)代码>您正在丢失返回结果
您需要设置foundIndex=binarySearch(newList,key)
另外,由于中点依赖于list.size()
,因此需要调整返回结果(否则它将始终为-1或0)。每次调用binarySearch(newList,key)代码>您正在丢失返回结果
您需要设置foundIndex=binarySearch(newList,key)
另外,由于中点依赖于list.size()
,因此需要调整返回结果(否则它将始终为-1或0)。不存储递归调用的返回值。替换这两行
binarySearch(newList, key);
借
它应该可以工作。您不存储递归调用的返回值。替换这两行
binarySearch(newList, key);
借
它应该可以工作。这里有一个解决方案,可以在原始列表中返回索引。主要的变化是:当您递归调用binarySearch时,您将newList
的偏移量添加到其结果中(与list
相比)。在midPointValue>key
中,此偏移量为零,因此无需添加任何内容。如果middpointvalue
,则偏移量为middpoint
public int binarySearch(ArrayList<Integer> list, int key){
int foundAtIndex = -1;
int midPoint = list.size()/2;
int midPointValue = list.get(midPoint);
if(list.size() > 1){
if(midPointValue == key){
foundAtIndex = midPoint;
}
else if(midPointValue > key){
ArrayList<Integer> newList = new ArrayList<Integer>();
for(int i = 0; i < midPoint; i++){
newList.add(list.get(i));
}
return binarySearch(newList, key);
}
else if(midPointValue < key){
ArrayList<Integer> newList = new ArrayList<Integer>();
for(int j = midPoint+1; j < list.size(); j++){
newList.add(list.get(j));
}
return midPoint + binarySearch(newList, key);
}
}
else if(list.size() == 1){
if(list.get(0) == key){
foundAtIndex = 0;
}
}
//return the index where the key was found, or -1 if not found
return foundAtIndex;
}
下面是一个在原始列表中返回索引的解决方案。主要的变化是:当您递归调用binarySearch时,您将newList
的偏移量添加到其结果中(与list
相比)。在midPointValue>key
中,此偏移量为零,因此无需添加任何内容。如果middpointvalue
,则偏移量为middpoint
public int binarySearch(ArrayList<Integer> list, int key){
int foundAtIndex = -1;
int midPoint = list.size()/2;
int midPointValue = list.get(midPoint);
if(list.size() > 1){
if(midPointValue == key){
foundAtIndex = midPoint;
}
else if(midPointValue > key){
ArrayList<Integer> newList = new ArrayList<Integer>();
for(int i = 0; i < midPoint; i++){
newList.add(list.get(i));
}
return binarySearch(newList, key);
}
else if(midPointValue < key){
ArrayList<Integer> newList = new ArrayList<Integer>();
for(int j = midPoint+1; j < list.size(); j++){
newList.add(list.get(j));
}
return midPoint + binarySearch(newList, key);
}
}
else if(list.size() == 1){
if(list.get(0) == key){
foundAtIndex = 0;
}
}
//return the index where the key was found, or -1 if not found
return foundAtIndex;
}
昨天我的合并排序也有同样的问题!!我总是忘记存储值>\u<非常感谢!!:)昨天我的合并排序也有同样的问题!!我总是忘记存储值>\u<非常感谢!!:)您可以向递归调用传递开始索引和结束索引,并传递整个列表(现在是子列表),以便它在末尾返回的索引将是“全局”索引,而不是子列表中的索引。您可以向递归调用传递开始索引和结束索引,并传递整个列表(现在是子列表)因此,它在末尾返回的索引将是“全局”索引,而不是子列表中的索引。您正在循环以构建子列表的事实并不是很好。考虑使用初始数组并传递开始和结束参数以及初始列表。请参阅下面我更新的答案。它解决了返回正确索引的问题。事实上,您正在循环构建子列表并不是很好。考虑使用初始数组并传递开始和结束参数以及初始列表。请参阅下面我更新的答案。它解决了返回正确索引的问题
public int binarySearch(ArrayList<Integer> list, int key) {
return binarySearch(list, key, 0, list.size());
}
public int binarySearch(ArrayList<Integer> list, int key, int begin, int end) {
if(end <= begin)
return -1; // Range is empty => key wasn't found
int mid = (begin + end) / 2;
int midValue = list.get(mid);
if(midValue == key)
return mid;
else if(midValue < key)
return binarySearch(list, begin, mid);
else
return binarySearch(list, mid + 1, end);
}