2012-03-18 54 views
2

我很困惑,在这发生的确切位置。我已经在纸上追踪了这个简单的代码,并使用了计算机,但我无法弄清楚。在我的例子中,我创建了一个{1,2,3,4,5}的数组,它为数字4和5提出了这个错误。它对数字1,2和3以及数字没有阵列。任何人都可以帮忙吗?索引超出二进制搜索的界限例外

public static int search(int[] ar, int num) 
{ 
    int low=0; 
    int hi=ar.length-1; 
    int mid=(low+hi/2); 
    while(hi>=low || mid<=low || mid>=hi) 
    { 
     if(ar[mid]==num) 
     { 
      return mid; 
     } 
     else if(ar[mid]>num) 
     { 
      hi=mid-1; 
      mid=(low+hi/2); 
     } 
     else 
     { 
      low=mid+1; 
      mid=(low+hi/2); 
     } 
    } 
    return -1; 
} 
+0

您如何使用调试器来追踪真实? – 2012-03-18 20:16:12

+0

您有可能在哪一行上发布超出界限的机会吗? – mfrankli 2012-03-18 20:16:17

+0

该部分:if(ar [mid] == num) – frozenxdreamer 2012-03-18 20:18:36

回答

3
mid=(low+hi/2); 

您需要使用puneheses,以便在添加low和hi之后进行分割。

mid=(low+hi)/2; 

此外,你的循环条件不应该让中间>高,因为那么它不会在数组中大数量的termintate。

+0

感谢您指出这一点!我似乎总是想念最愚蠢的小事。但现在它找不到最高的数字?我会去看看我是否犯了其他愚蠢的错误。 – frozenxdreamer 2012-03-18 20:30:24

+0

@frozenxdreamer正如其他人所建议的,尝试添加一些打印语句并查看程序的执行情况,这不仅仅是在心理上追踪这些步骤。您也可以使用IDE的调试器。 – 2012-03-18 20:46:39

0

问题是您继续循环的条件。尝试修改此:

while (hi>=low || mid<=low || mid>=hi) { 

这样:

while (hi>=low) { 

如果hi < low,您不想继续循环,无论其他两个条件(其中一个将永远是真实的,我想,如果hi < low)。