수학과의 좌충우돌 프로그래밍

[C++] 이진 탐색 알고리즘 본문

알고리즘/C++

[C++] 이진 탐색 알고리즘

ssung.k 2019. 3. 26. 00:21

이진 탐색 알고리즘 (Binary Search)

  • 이진탐색의 특징

    • log N 의 시간복잡도
    • 데이터가 정렬되있는 배열에서만 사용가능
    • 반복문, 재귀함수를 통한 두 가지 방법으로 구현 가능
  • 반복문을 통한 이진 탐색 구현

    int search(int *arr, int length, int target)
    {
        int start = 0;
        int end = length-1;
        int mid = 0;
        while (start <= end){
            mid = (start+end) / 2;
            if (arr[mid] == target)
                return mid;
            else {
                if (arr[mid] < target)
                    start = mid+1;
                else if (arr[mid] > target)
                    end = mid-1;
            }
        }
        return -1;
    }
    

     

  • 재귀함수를 통한 이진 탐색 구현

    int recursive_search(int *arr, int start, int end, int target)
    {
        int mid = (start+end) / 2;
        if (start > end)
            return -1;
        else {
            if (arr[mid] == target)
                return mid;
            else {
                if (arr[mid] < target)
                    recursive_search(arr, mid+1, end, target);
                else if (arr[mid] > target)
                    recursive_search(arr, start, mid-1, target);
            }
        }
    }
    

     

  • 확인

    int main(int argc, const char * argv[])
    {
        int arr[10] = {1,2,3,5,7,11,14,19,25,30};
        int num;
        int result;
        
        cout << "찾고자 하는 수를 입력하세요." << endl;
        
        cin >> num;
        int arr_size = sizeof(arr) / sizeof(*arr);
        result = search(arr,arr_size, num);
        if (result == -1)
            cout << "값이 존재하지 않습니다." << endl;
        else
            cout << "index:" << result << "에 있습니다." << endl;
        result = recursive_search(arr,0,arr_size-1, num);
        if (result == -1)
            cout << "값이 존재하지 않습니다." << endl;
        else
            cout << "index:" << result << "에 있습니다." << endl;
    }
    

     

Comments