이진 탐색은 정렬된 리스트에서 검색 범위를 줄여 나가면서 검색 값을 찾는 알고리즘이다.
후에 방식을 보면 이해하겠지만 반드시 정렬된(오름차순, 내림차순) 데이터에만 적용할 수 있는 탐색 알고리즘이다.

javascript code
// ary: 탐색할 배열, low: 왼쪽 포인터, high: 오른쪽 포인터, goal: 검색 값
const binarySearch = (ary, low, high, goal) => {
while(low <= high) {
const mid = low + (high - low) / 2;
if(arr[mid] === goal) return mid; // 검색 성공
if(arr[mid] < goal) low = mid + 1;
if(arr[mid] > goal) high = mid - 1;
}
return -1; // 검색 실패
}
java code
// ary: 탐색할 배열, low: 왼쪽 포인터, high: 오른쪽 포인터, goal: 검색 값
public int binarySearch(int ary[], int low, int high, int goal) {
while(low <= high) {
int mid = low + (high - low) / 2;
if(arr[mid] == goal) return mid; // 검색 성공
if(arr[mid] < goal) low = mid + 1;
if(arr[mid] > goal) high = mid - 1;
}
return -1; // 검색 실패
}
javascript code
// ary: 탐색할 배열, low: 왼쪽 포인터, high: 오른쪽 포인터, goal: 검색 값
const binarySearch = (ary, low, high, goal) => {
if(low > high) return -1; // 검색 실패
const mid = low + (high - low) / 2;
if(arr[mid] === goal) return mid; // 검색 성공
if(arr[mid] < goal) return binarySearch(arr, low, mid - 1, goal);
if(arr[mid] > goal) return binarySearch(arr, mid + 1, high, goal);
}
java code
// ary: 탐색할 배열, low: 왼쪽 포인터, high: 오른쪽 포인터, goal: 검색 값
public int binarySearch(int ary[], int low, int high, int goal) {
if(low > high) return -1; // 검색 실패
int mid = low + (high - low) / 2;
if(arr[mid] == goal) return mid; // 검색 성공
if(arr[mid] < goal) return binarySearch(arr, low, mid - 1, goal);
if(arr[mid] > goal) return binarySearch(arr, mid + 1, high, goal);
}
위 구현은 다음 방식을 사용하였다.
int mid = low + (high - low) / 2
다음과 같이 간결하게 사용하면 되지 않을까?
int mid = (low + high) / 2
두번 째 방식에서 low + high 값이 Integer 범위보다 크다면 음수 값으로 오버플로우 될 것이고 해당 값을 2로 나누면 mid는 음수가 되기 때문에 탐색에 문제가 된다.
그렇기 때문에 low + high의 값이 범위를 벗어난다면 첫번째, 그렇지 않다면 연산이 간단한 두번째 방식을 채용하는 것이 효율적이다.
Best의 경우 빠른 시간내로 값을 구할 수 있지만 최악의 경우 데이터가 하나 남을 때 까지 탐색한다.


시간 복잡도를 계산해 보자.
따라서 이진 탐색의 시간 복잡도는 이다.
시간복잡도랑 개념을 확실히 할 수 있는 설명이네여 감쟈합니다.