#include <stdio.h>

int search(int a[], int len, int target){
int first = 0;
int last = len - 1; // 왜 len이 아니라 len-1일까?
int mid;

while (first <= last){ // 왜 last가 크거나 같아야하는가?

mid = (first + last) / 2;
if (a[mid] == target){
return mid;
}
else {
if (a[mid] > target){
last = mid - 1; // mid에 -1이 없다면 찾는 값이 1일때 무한 반복한다.
}
else{
first = mid + 1; // mid에 +1이 없다면 찾는 값이 5일때 무한 반복한다.
}
}
}
return -1;
}

int main(){
int a[] = { 0, 1, 2, 3, 4 };
int result;
result = search(a, sizeof(a) / sizeof(int), 4);

if (result == -1){
puts("탐색이 실패했습니다.");
}
else{
printf("탐색한 인덱스 %d \n", result);
}
return 0;
}

- 이진탐색은 인덱스가 미리 정렬되어 있어야 한다는 제한이 있다.
- mid값의 대소를 비교하여 first 또는 last를 제한한다는 것이 특징이다.
- last가 len-1인 이유는 01234가 있을때 가운데 값은 2다. (0+4)/2 = 2 (0+5)/2 = 2 더 정확한 값은 4/2다.
- first < last라면 4를 예로 들어도 아래 그림처럼 first와 last가 같아진다. 리턴하기전에 while문에서 나가면 안된다.

그림

target first last mid count
4 0 4 2 1
4 3 4 3 2
4 4 4 4 3 -> 리턴

'자료구조' 카테고리의 다른 글

[자료구조] 링크드 리스트의 이해  (0) 2019.12.12
[자료구조] 배열로 된 연결 리스트  (0) 2019.12.12
[자료구조] 선택정렬  (0) 2019.12.07
[자료구조] 버블소트  (0) 2019.12.07
[자료구조] 순차탐색  (0) 2019.12.02
블로그 이미지

ryancha9

https://blog.naver.com/7246lsy

,