공부기록/알고리즘

[알고리즘] 이진탐색 (binary search)

gyungmean 2021. 5. 28. 01:08

이진 탐색은 중앙 값을 찾고 찾고자 하는 항목이 왼쪽에 있는지 오른쪽에 있는지 알아내어 탐색 범위를 반씩 줄여나간다.

비교가 이루어 질 때마다 탐색 범위가 급격하게 졸어들기 때문에 정렬된 배열을 탐색할 때는 이진탐색이 빠르다.

데이터의 삽입이나 삭제가 빈번할 경우에는 적합하지 않다.

 

의사코드

binary_search(list, low, high):

	middle <- low에서 high사이의 중간 위치
    if(탐색값 == list[middle])
    	return middle;
	else if(탐색값 < list[middle])
    	return list[0]부터 list[middle-1]에서의 탐색;
    else if(탐색값 > list[middle])
    	return list[middle+1]부터 list[high]에서의 탐색;

 

구현 방법에는 순환 호출과 반복 두가지가 있다.

 

순환 호출

int binary_search(int key, int low, int high)
{
	int mid;
    
    if(low <= high) {
    	mid = (low + high) / 2;
        if(key == list[mid]) //탐색성공
        	return mid;
        else if(key < list[mid]) //왼쪽 부분 리스트 탐색
        	return binary_search(key, low, mid - 1);
        else //오른쪽 부분 리스트 탐색
        	return binary_search(key, mid + 1, high);
    }
    return -1; //탐색 실패
}

 

반복

int binary_search(int key, int low, int high)
{
	int mid;
    
    while(low <= high) {
    	mid - (low + high) / 2;
        if(key == list[mid])
        	return mid;
        else if(key > list[mid]) //오른쪽부분탐색
        	low = mid + 1; 
        else //왼쪽부분탐색
        	high = mid - 1;
    }
  	return -1;
}