이진 검색 알고리즘은 오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘입니다.
장점 : 검색이 반복될 때마다 목표값을 찾을 확률이 두배가 되므로 속도가 빠릅니다.
단점 : 검색 원리상(중간 값을 찾아야 하기에) 정렬된 리스트에만 사용할 수 있습니다.
0. 선행 조건
배열 : arr[1,2,3,4,5,6,7]
찾는 값 : 5
1. 배열의 중간 값을 임의의 값으로 선택
key(찾는 값) : 5
mid(중앙 값) : 4
검색 범위 : 1, 2, 3, 4, 5, 6, 7
2. 중앙 값과 찾고자 하는 값의 크고 작음을 비교
2-1. 중앙값(4) < 찾는 값(5)
: 중앙값 기준 배열의 오른쪽 구간을 대상으로 탐색
(값을 찾거나 간격이 0이 될때까지 반복)
key(찾는 값) : 5
mid(중앙 값) : 6
검색 범위 : 4, 5, 6, 7
2-2 중앙값(6) > 찾는 값(5)
: 중앙값 기준 배열의 왼쪽 구간을 대상으로 탐색
(값을 찾거나 간격이 0이 될때까지 반복)
key(찾는 값) : 5
mid(중앙 값) : 5
검색 범위 : 4, 5, 6
2-3 중앙 값 = 찾는 값 : 값을 찾았으니 검색 종료
3. 값을 찾거나 간격이 0이 될때까지 반복
💡 TIP. 중앙 값 계산식
int mid = (low + high) / 2
//만약 배열의 크기가 커지게 된다면
//low + high를 했을 때 int 범위를 벗어날 수 있기에 이렇게 사용하는편이 좋음
int mid = low + (hight-low) / 2
Θ(log n)
public int binarySearch(int[] arr, int target) {
int start = 0;
int end = arr.length - 1;
int mid = 0;
while (start <= end) {
mid = (start + end) / 2;
if (target == arr[mid]) {
return mid;
}else if (arr[mid] < target) {
start = mid + 1;
}else if (target < arr[mid]) {
end = mid - 1;
}
}
throw new NoSuchElementException("can't find target.");
}