이진 탐색은 순차 탐색에 비해 평균적으로 빠르지만 탐색에 대상이 되는 배열이 정렬된 상태임이 보장되어야 한다.
또 정렬된 배열이 오름차순인지 내림차순인지 따라 내부 구현이 살짝 달라지게 된다.
여기서는 오름차순 배열을 대상으로 하겠다.
int bin_search(int * arr, int len, int target)
{
int l = 0, r = len - 1;
int mid;
while (l <= r)
{
mid = (l + r) / 2;
if (arr[mid] == target)
return mid;
else if (arr[mid] < target)
l = mid + 1;
else
r = mid - 1;
}
return -1;
}
"l" 은 left 인덱스이고, "r" 은 right 인덱스이다.
그래서 두 인덱스의 중간값을 구하고 그 인덱스가 위치한 배열의 값과 탐색하고자 하는 값을 비교하는데,
발견하면 이 인덱스 값을 바로 반환하면 되는 것이고,
그렇지 않다면 다음에 사용 할 인덱스 값을 조정하게 된다.
먼저 찾고자하는 값보다 작은 경우이다.
mid < target < right
배열은 정렬되어 있기 때문에 위와 같은 경우가 된다.
mid는 이미 탐색하였기 때문에 mid + 1 을 새로운 left값으로 잡는 것이다.
큰 경우는 아래와 같다.
left < target < mid
반대로 mid - 1을 새로운 right로 잡게된다.
그래서 이러한 작업을 left 가 right를 넘어서지 않을 때 까지 반복하는 것이고,
반복문을 빠져나오게 되면 left가 right를 넘어서는 상황이 발생하게 되기 때문에
타겟이 배열내에 없음을 반환하는 것이다.
'알고리즘' 카테고리의 다른 글
같은 것이 있는 순열 (0) | 2021.10.28 |
---|---|
중복 조합 (0) | 2021.10.28 |
Graph, DFS and BFS (0) | 2021.10.27 |
병합정렬 (0) | 2021.10.27 |
삽입정렬 (0) | 2021.10.27 |