-1

이 메서드가 ArrayIndexOutOfBounds 예외를 throw하는 이유를 알지 못합니다.binarySearch 메서드 Throwing ArrayIndexOutOfBounds 예외 - Java

When I change the initial "high" 값을 "int high = array.length - 1;"으로 변경하면 프로그램에서 return any integer value을 검색합니다.

내가 뭘 잘못하고 있니?

미리 감사드립니다.


public class BinarySearch { 

public static void main(String[] args) { 

    int searchValue = 12; 
    int[] givenNums = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
    binarySearch(givenNums, searchValue); 
    System.out.println("\nResult: " + searchValue); 

} 

public static int binarySearch(int[] array, int key) { 
    int low = 0; 
    int high = array.length; 
    int mid = (low + high)/2; 
    int i = 0; 
    System.out.println(); 

    while (low <= high) { 
     System.out.print(i + " "); 
     if (array[mid] < key) { 
      low = mid + 1; 
      mid = (low + high)/2; 
     } else if (array[mid] > key) { 
      high = mid - 1; 
      mid = (low + high)/2; 
     } 
     else 
      return mid; 

     i++; 
    } 
    return -1; 
} 
} 
+1

이다 편곡 당신 * 단지 * 게시 [아주 비슷한 질문] (http://stackoverflow.com/questions/12827289/ ARR입니다 binarysearch-method-throwing-arrayindexoutofbounds-exception-java). 당신은 이미이 에러가 발생하는 이유를 이미 들었습니다 : 당신은'array.length'로 높게 설정할 수 없습니다. 코드가 완료까지 실행되지 않으면 올바른 대답을 생성하지 못하는 것보다 바람직하지 않습니다 (적어도이 경우는 아님). 'array.length - 1' 대신에'array.length'를'high '로 설정하면 아무 것도 고치지 않고, 단지 상황을 악화시킬뿐입니다. – NullUserException

+0

@ user1735982 .. 내 게시물을보고 정확하게 무엇을하는지 이해하십시오 .. –

+0

다른 방법, 다른 문제. –

답변

5

에서 시작으로 배열의 최대 인덱스 array.length - 1입니다 포괄적으로 또는 독점적으로 .

int high = array.length; 

을하지만 다음 while 루프 조건이 결합 된 포함 위의 경우에만 적합합니다 :

while (low <= high) 

당신은 아마 그냥 while을 변경해야합니다 당신은 바운드 전용 상단 인로 시작 조건 :

while (low < high) 

... 그리고나중에.

또는이 값을 포함하여 초기 값을 array.length - 1으로 변경할 수 있습니다.

그런 상황이 끝나면 low == high == mid == array.length이 폭발합니다.

mid = (low + high)/2 계산을 while 루프 내의 첫 번째 문장으로 옮기는 것이 좋습니다. 그러면 중복 코드를 제거 할 수 있습니다. 자바

while (low < high) {   
    mid = (low + high)/2; 
    System.out.print(i + " "); 
    if (array[mid] < key) { 
     low = mid + 1; 
    } else if (array[mid] > key) { 
     high = mid; 
    } 
    else { 
     return mid; 
    } 
    i++; 
} 
3

그들이 그것을 할 수 있습니다 당신은 high이 최대 값을 의미 여부에 대한 일관성이 필요 0

1

어레이 ... 즉, 0에서 인덱싱

INT [] = 새로운 도착 INT [10];

첫 번째 값은 [0] 마지막으로 [9], 길이가 10