BinarySearch在列表中找不到元素,即使它是';那里有:Java

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

有人能指出我哪里出了问题吗?我用一个调试器进行了调试,看起来我的算法应该找到搜索键,但不是。(为了检查,我打印了'foundat index',然后是[sorted]列表的内容;我搜索的元素123在列表中,但返回了'not found'值-1。)

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);
}