[알고리즘]BinarySearch

정태규·2023년 4월 17일
0

알고리즘

목록 보기
9/15
post-thumbnail

BinarySearch(Recursive)

✍️size가 n인 정렬된 array S에서 K가 있는지 찾기

sorted array S[0..,n-1] , key k

k >= 0

S=[10,12,13,14,18,20,25] and k=18

먼저 S를 반으로 쪼갠다.
key인 18은 14보다 크므로 14보다 큰 곳의 배열만 찾으면 된다.
[14,18,20,25] 중에서 중간 값인 18이 찾으려는 값이므로 값을 찾았다.

이것을 한번 코드로 구현해보자.
java로 한번 구현 해보았다.

class Main {
  public static void main(String[] args) {
    int[] arr= {1,2,3,4,5,6,7,8,9,10};
    BS bs = new BS();
    System.out.println("find key: "+bs.BinarySearch(arr,0,9,9));
  }
}

class BS{
  int start;
  int end;
  int arr[];
  int key;
  int cnt = 0; // 몇번에 걸쳐 key를 찾았는지
  
  BS(){ 
  }

  int BinarySearch(int A[],int start,int end,int key){
    int mid = (start+end)/2;
    cnt ++;
    
    System.out.println("start:"+start);
    System.out.println("end:"+end);
    System.out.println("mid:"+mid);
    
    //mid가 key 값과 같으면 return
    if(A[mid] == key){
      System.out.println("cnt:"+cnt);
      return key;
    }
    // mid를 기준으로 반으로 배열을 자른뒤 조건에 맞는 배열을 찾는다.
    else if(key < A[mid]){ 
      return BinarySearch(A,start,mid-1,key);
     }
      
    else  return BinarySearch(A,mid+1,end,key);

    
  }
  
}
결과:
start:0
end:9
mid:4
start:5
end:9
mid:7
start:8
end:9
mid:8
cnt:3
find key: 9

time complexity = O(log n)이다.

0개의 댓글