Vienna
5일차 (4) 본문
Q10. 단순 삽입 정렬을 배열의 요소 개수가 많아지면 많아질수록 요소 삽입에 필요한 비교, 대입 비용이 무시할 수 없을 정도로 커집니다. 이때 배열에서 이미 정렬된 부분은 이진 검색을 사용할 수 있기 때문에 삽입할 위치를 더 빨리 찾을 수 있습니다. 이진 검색을 사용하여 프로그램을 수정하세요.
정답:
idx = pl <= pr ? pc + 1 : pr + 1;
이 부분이 이해가 잘 안 된다. 우선 정확히 일치하는 a[pc]가 없는 경우에는 break에 어떻게 도달하는지도 궁금하고... 아 pl<=pr 돼도 탈출하는구나 그래서 idx=(pl<=pr)?을 확인하는 거였네. break에 도달해서 탈출했냐 아니면 do while 조건문에 도달해서 탈출했냐 확인하고 만약 break에 도달했다면 pc+1(동일한 데이터의 다음 인덱스), 그리고 do while 조건문에 의해서 탈출한거면 pr+1(정렬된 데이터 내부에는 없다는 뜻이니까) 인덱스를 저장하는 거구나
이해했다. 다음에 또 복습할 땐 풀 수 있을 것 같다.
void insertion(int a[], int n) {
int j;
for (int i = 1; i < n; i++) {
int tmp = a[i];
int pl = 0, pr = i-1;
int pc;
int idx;
do {
pc = (pl + pr) / 2;
if (a[pc] == tmp) break;
else if (a[pc] < tmp) pl = pc + 1;
else pr = pc - 1;
} while (pl <= pr);
idx = pl <= pr ? pc + 1 : pr + 1;
for (j = i; j > idx; j--)
a[j] = a[j - 1];
a[idx] = tmp;
}
}
'알고리즘 문제 풀이 > Do It! 자료구조와 함께 배우는 알고리즘 입문 C언어 편' 카테고리의 다른 글
6일차 (0) | 2021.11.25 |
---|---|
5일차 (5) (0) | 2021.11.24 |
5일차 (3) (0) | 2021.11.23 |
5일차 (2) (0) | 2021.11.23 |
5일차 (1) (0) | 2021.11.23 |
Comments