본문 바로가기
  • Code Smell
Language/Algorithm

[ALGORITHM] Binary Search : 이진탐색

by HSooo 2020. 1. 15.

[ALGORITHM] Binary Search

업다운 게임과 비슷하다.
찾으려는 값을 한가운데 값((min + max) / 2)과 비교하고

  • 작을 경우 min ~ ((min + max) / 2) 까지 다시 비교
  • 클 경우 ((min + max) / 2) ~ max 까지 다시 비교

첫 탐색에 대한 로직만 구현하고 이후 비교문에서는 재귀함수 방법을 사용한다.

들어오는 배열은 오름차순(sort)으로 정렬 되어있어야 한다.

구현체

public void binarySearch(int[] ar, int start, int end, int search, int cnt) {
        int index = (start + end) / 2;

        if(start > end) {
            System.out.println("not found search data : " + search);
            return;
        }

        if(ar[index] == search) {
            System.out.println("find search data : " + search + ", position : ar[" + index + "], try count : " + (++cnt));
        }
        else if(ar[index] > search) {
            binarySearch(ar, 0, index - 1, search, ++cnt);
        }
        else if(ar[index] < search) {
            binarySearch(ar, index + 1, end, search, ++cnt);
        }
    }
  • int[] ar : 찾으려는 데이터가 들어있는 배열 (오름차순 정렬이 되어 있어야 함.)
  • start : 탐색 범위의 가장 작은 인덱스, 0과 일치한다.
  • end : 탐색 범위의 가장 큰 인덱스, 전체탐색시 ar.length -1과 일치한다.
  • search : 찾으려는 값
  • cnt : recursive 호출 횟수, 탐색횟수와 같다.

사용

public static void main(String[] args) {
        int[] arr = {0, 2, 4, 6, 8, 10, 12, 13, 14, 15, 16, 18, 20, 22, 24, 26, 28, 30, 32, 50, 55, 100, 200};
        new Test().binarySearch(arr, 0, arr.length - 1, 24, 0);
        new Test().binarySearch(arr, 0, arr.length - 1, 4524, 0); //없는 값
        new Test().binarySearch(arr, 0, arr.length - 1, 1, 0); //없는 값
    }

Console


find search data : 24, position : ar[14], try count : 5
not found search data : 4524
not found search data : 1


'Language > Algorithm' 카테고리의 다른 글

[Programmers] 전화번호 목록 (Java)  (0) 2021.05.14
[Codility] CyclicRotation (Java)  (0) 2021.03.24
[Programmers] 체육복 (Java)  (0) 2021.03.23
[Codility] BinaryGap (Java)  (0) 2021.03.23
[LeetCode] Climbing Stairs 문제 (memoization)  (0) 2021.02.10

댓글