2012-03-18 78 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)。