Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 지식 보관소

이진탐색 Binary Search 본문

알고리즘

이진탐색 Binary Search

야식은진리다 2019. 8. 26. 23:58

이진 탐색 알고리즘을 사용하기 위해서는 배열에 저장된 데이터가 정렬되어있어야 한다. 다시 말해서 정렬되지 않은 배열에는 이진 탐색 알고리즘을 사용할 수 없다. 이진 탐색은 탐색의 범위를 반복해서 절반씩 줄이는 알고리즘이다.

 

배열 { 1,3,5,6,7,9,11,13,15,19 }에서 3을 찾는 과정은 다음과 같다.

 

첫 번째 시도

1 3 5 6 7 9 11 13 15 19
arr[1] arr[2] arr[3] arr[4] arr[5] arr[6] arr[7] arr[8] arr[9] arr[10]

1. 배열 인덱스의 시작과 끝을( 0과 10 ) 더해서 2로 나눈다.

2. 0과 10을 더해서 나눈 결과 5를 인덱스 값으로 해서 저장된 값이 3인지 확인한다.

 

 

두 번째 시도

1. arr[5]에 저장된 값이 3이 아님을 알았으니 arr[5]의 값과 3의 대소를 비교한다. 

2. 3은 arr[5]의 값인 7 보다 작으므로 탐색의 범위를 0 ~ 4로 제한한다.

3. 0과 4를 더해서 그 결과를 2로 나눈다.

4. 0과 4를 더해서 나눈 결과 2를 인덱스 값으로 해서 저장된 값이 3인지 확인한다.

5. arr[2]의 값이 3이 맞으므로 탐색을 종료한다.

 

 

Code

#include <stdio.h>

int BSearch(int ar[], int len, int target)
{
	int first = 0;			//탐색대상의 첫 인덱스
	int last = len - 1;		//탐색대상의 끝 인덱스
	int mid;

	while (first <= last)	//first와 last가 같은 경우 까지 검사하여야 마지막하나까지 검사할수있다.
	{
		mid = (first + last) / 2;		//탐색 대상의 가운데를 찾는다.
		if (target == ar[mid]) return mid;	//가운데 저장된것이 타겟값이라면 탐색을 종료한다.
		else
		{
			if (target < ar[mid]) last = mid - 1;	//찾고자 하는 수가 중앙의 수보다 작으면
			else first = mid + 1;			//찾고자 하는 수가 중앙의 수보다 크면
		}
	}
	return -1;
}

int main(void)
{
	int arr[] = { 1,3,5,6,7,9,11,13,15,19 };
	int index;

	index = BSearch(arr, sizeof(arr) / sizeof(int), 3);	//arr에 3을 탐색
	if (index == -1) printf("해당값 없음\n");
	else printf("타겟의 위치 : %d\n", index);
	
	return 0;
}

종료 조건

이진 탐색 알고리즘의 종료 조건은 찾고자 하는 값을 찾았거나, first가 last보다 큰 경우이다. 후자의 경우에는 탐색 실패를 뜻한다.

'알고리즘' 카테고리의 다른 글

후위 표기법  (0) 2020.08.15
하노이의 탑 The Tower of Hanoi  (0) 2019.12.14
피보나치수열 Fibonacci Sequence  (0) 2019.08.31
재귀 Recursion / 팩토리얼 Factorial  (0) 2019.08.31