더북(TheBook)

2.3.1 코드 구현: 이진 검색

다음은 루비로 구현한 이진 검색이다.

def binary_search(array, search_value)
    
    # 먼저 찾으려는 값이 있을 수 있는 상한선과 하한선을 정한다.
    # 최초의 상한선은 배열의 첫 번째 값, 하한선은 마지막 값이다.

    lower_bound = 0
    upper_bound = array.length - 1
    
    # 상한선과 하한선 사이의 가운데 값을 계속해서 확인하는 루프를 시작한다.

    while lower_bound <= upper_bound do
        
        # 상한선과 하한선 사이에 중간 지점을 찾는다.
        # (결괏값이 정수가 아닐까 봐 걱정할 필요 없다.
        # 루비는 정수를 나누기할 때 결괏값을 가장 가까운 정수로 올림한다.)

        midpoint = (upper_bound + lower_bound) / 2
        
        # 중간 지점의 값을 확인한다.

        value_at_midpoint = array[midpoint]
        
        # 중간 지점의 값이 찾고 있던 값이면 검색을 끝낸다.
        # 그렇지 않으면 더 클지 작을지 추측한 바에 따라 상한선이나 하한선을 바꾼다.

        if search_value == value_at_midpoint
            return midpoint
        elsif search_value < value_at_midpoint
            upper_bound = midpoint - 1
        elsif search_value > value_at_midpoint
            lower_bound = midpoint + 1
        end
    end
    
    # 상한선과 하한선이 같아질 때까지 경곗값을 줄였다면
    # 찾고 있는 값이 이 배열에 없다는 의미다.

    return nil
end
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.