정렬된 배열 또는 리스트에 적합한 고속 탐색 방법이다.
처음 범위는 인덱스 0부터 끝까지이다. 이 때 중간 인덱스를 mid로 한다.(이 때 배열 / 리스트는 정렬되어 있어야한다.)
mid의 값와 찾는 원소를 비교한다.
2-1. 찾는 원소와 mid의 값이 같다면 탐색 종료한다.
2-2. mid의 값 < 찾는 원소 일 때 left는 mid + 1로 하여 2)를 다시 반복한다.
2-3. mid의 값 > 찾는 원소 일 때 right는 mid - 1 로 하여 2)를 다시 반복한다.
만약 right > left가 된다면 해당 배열에 찾는 원소가 없는 것이다.

int binarySearch1(int key, int low, int high) {
int mid;
if(low < high) {
mid = (low + high) / 2;
if(key == arr[mid]) { // 탐색 성공
return mid;
} else if(key < arr[mid]) {
// 왼쪽 부분 arr[0]부터 arr[mid-1]에서의 탐색
return binarySearch1(key ,low, mid);
} else {
// 오른쪽 부분 - arr[mid+1]부터 arr[high]에서의 탐색
return binarySearch1(key, mid+1, high);
}
}
return -1; // 탐색 실패
}

int binarySearch2(int key, int low, int high) {
int mid;
while(low < high) {
mid = (low + high) / 2;
if(key == arr[mid]) {
return mid;
} else if(key < arr[mid]) {
high = mid;
} else {
low = mid + 1;
}
}
return -1; // 탐색 실패
}
| 순차적 탐색 | 이분 탐색 |
|---|---|
| O(n) | O(log n) |