μ•Œκ³ λ¦¬μ¦˜/κΈ°λ³ΈκΈ° λ‹€μ§€κΈ°

[μ•Œκ³ λ¦¬μ¦˜] 이뢄 탐색(이진탐색) - BinarySearch

λ˜νš¨λ‹ˆ 2020. 2. 5. 18:15

이뢄 탐색(이진탐색) μ•Œκ³ λ¦¬μ¦˜ 은 찾을 λ²”μœ„λ₯Ό 반으둜 λ‚˜λˆ μ„œ νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

처음 μ€‘κ°„μ˜ 값을 μž„μ˜μ˜ κ°’μœΌλ‘œ μ„ νƒν•˜μ—¬, κ·Έ κ°’κ³Ό ν‚€κ°’μ˜ 크고 μž‘μŒμ„ λΉ„κ΅ν•˜λŠ” 방식이닀. μ²˜μŒ μ„ νƒν•œ 쀑간값이 λ§Œμ•½ μ°ΎλŠ” 값보닀 크면 μ΅œλŒ“κ°’μ΄ 되고, μž‘μœΌλ©΄ μ΅œμ†Ÿκ°’μ΄ λœλ‹€.

 

- λΆ„ν•  정볡 μ•Œκ³ λ¦¬μ¦˜μ— μ†ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€. 

- 단, 이미 μ •λ ¬λœ κ²½μš°μ—λ§Œ μ μš©ν•  수 μžˆλ‹€.

- μ΅œμ•…μ˜ κ²½μš°λŠ” μ°ΎμœΌλ €λŠ” 킀값이 배열에 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œμ΄λ‹€.

- μ‹œκ°„λ³΅μž‘λ„λŠ” O(logN) 이닀.

 

 

λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜λŠ” 경우

int BinarySearch(int arr[], int length, int key){
	int first = 0;
    	int last = length - 1;
    	int mid = 0;
    
        while(first <= last){
            mid = (first+last)/2;
            if(arr[mid] > key){ // 쀑간값이 μ°ΎμœΌλ €λŠ” 킀값보닀 크닀면
                last = mid - 1;
            }else if(arr[mid] < key){ // 쀑간값이 μ°ΎμœΌλ €λŠ” 킀값보닀 μž‘λ‹€λ©΄
                low = mid + 1;
            }else{ // 쀑간값과 μ°ΎμœΌλ €λŠ” 킀값이 κ°™λ‹€λ©΄
                return mid;
            }
        }
        return -1; // 킀값을 λͺ»μ°ΎμœΌλ©΄ -1을 리턴
}

 

μž¬κ·€ν˜ΈμΆœμ„ μ‚¬μš©ν•˜λŠ” 경우

int BinarySearch(int arr[], int key, int first, int last){
      int mid = 0;

      if(first>last){
          return -1;
      }else{
          mid = (first+last)/2;
          if(arr[mid] == key){
              return mid;
          }else if(arr[mid] < key){
              BinarySearch(arr, key, first, mid-1);
          }else{
              BinarySearch(arr, key, mid+1, last);
          }
      }
}
λ°˜μ‘ν˜•