input
23 | 87 | 65 | 12 | 57 | 32 | 99 | 81 |
정렬된 배열 상태
+ 두 개의 변수 필요 (left, right)
🔽lt 📍mid 🔽rt
12 | 23 | 32 | 57 | 65 | 81 | 87 | 99 |
mid = (lt + rt) /2;
= 0+7 / 2
= 3
a [mid] 값과 32(key) 비교 !!
if ( a[mid] == key ) "mid+1" 출력
else if ( a[mid] > key ) // mid 보다 큰 인덱스에는 해당 값이 없음 (=4~7에는 없음)
rt = mid-1;
else if ( a[mid] < key ) //mid 보다 작은 인덱스에는 해당 값이 없음 (=0~2범위에는 없음)
lt = mid+1;
=> a[mid] > key
🔽lt 📍mid 🔽rt
12 | 23 | 32 | 57 | 65 | 81 | 87 | 99 |
=> a[mid] < key
🔽lt 🔽rt
12 | 23 | 32 | 57 | 65 | 81 | 87 | 99 |
📍mid
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
freopen("input.txt", "rt", stdin);
int n, i, key, lt=0, rt, mid, tmp;
scanf("%d %d", &n, &key);
vector<int> a(n);
for(i=0; i<n; i++){
scanf("%d", &a[i]);
// scanf("%d", &tmp); //vector 배열에 삽입하는 방법
// a.push_back(tmp);
}
// printf("%d\n", *(a.end()-1)); //81출력됨
sort(a.begin(), a.end()); //a,end()는 배열의 마지막 자리+1 가르킴
rt=n-1;
while(lt<=rt){ //lt가 rt보다 커지게 되면 key 값은 배열에 없는 것
mid = (lt+rt)/2;
if(a[mid]==key) {
printf("%d", mid+1);
return 0;
}
else if (a[mid]>key) rt=mid-1;
else if (a[mid]<key) lt=mid+1;
}
return 0;
}
'스터디 > 알고리즘' 카테고리의 다른 글
[알고리즘][C++] 마구간 정하기(이분탐색 응용) ; 결정 알고리즘 (0) | 2022.08.04 |
---|---|
[알고리즘][C++] 뮤직비디오(이분탐색 응용) ; 결정 알고리즘 (0) | 2022.08.04 |
[알고리즘][C++] 연속된 자연수의 합 (0) | 2022.08.02 |
[알고리즘][C++] 교집합(two pointers) (0) | 2022.08.01 |
[알고리즘][C++] 두 배열 합치기(병합정렬 예비학습) (0) | 2022.08.01 |