int search(int a[], int n, int x)
{
int l, r, m;
l = 0;
r = n - 1;
while (l <= r)
{
m = (l + r) / 2;
if (x = a[m])
return m;
else (x < a[m])
r = m - 1;
else
l = m + 1;
}
return -1;
}
배열의 왼쪽 끝은 l 이 가리키고있고 오른쪽 끝은 r이 가리키고 중간을 m이 가리킴
찾아서 리턴할때 l,r안변하지
x < a[m] 일때 소팅되어있기 때문에 저 조건을 깰 방법이 없음
Invariant: 만약 어떤 i에 대해 a[i] = x 라면 l ≤ i ≤ r 이 항상 성립한다
한번 루프 돌때마다 r - l 이 줄어들어.
그러나 한없이 줄어들수는 없음. 언젠가는 l ≤ r조건이 깨지게됨
!(l ≤ r) < = > l >r 인데 이게 설=ㅇ립할리가 없음
내가 생각하는 논리가 완결성있다는걸 증명하는게 중요해
int search(int a[], int n, int x)
{
if (n == 0)
return -1;
if (n == 1)
{
if (a[0] == x)
return 0;
else
return -1;
} // 길이가 0, 1 일때의 경우 처리-> 생각해보면 1일때는 밑에경우에도 처리가능함
// 나머지경우 처리해보자
int m = n / 2;
if (a[m] == x)
return m;
else if (x < a[m])
return search(a, m, x);
else
{
int result = search(a + m + 1, n - (m + 1), x);
if (result == -1)
return -1;
else
return result + m + 1;
}