Vienna
4일차 (2) 본문
Q4. 버블 정렬(버전 2)을 연습문제 Q2(204쪽)처럼 비교, 교환 과정을 자세히 출력하는 프로그램으로 수정하세요.
내 답변:
Q2에서 쓴 답변에서 크게 바꾸지는 않았다. 해당 패스에서 교환횟수가 0인지 여부를 언제 확인할지 고민해봤는데, 정렬이 된 순간 exit(1)을 써서 탈출하면 비교 횟수와 교환 횟수가 뜨지 않기 때문에 검사 중인 패스는 모두 끝마치고 확인하는 것으로 하고 break를 써서 for 문을 탈출 시켰다.
void bubble(int a[], int n) {
int count_swap = 0, count_cmp = 0;
for (int i = 0; i < n - 1; i++) {
int exg = 0;
printf("패스%d:\n", i);
for (int j = n - 1; j > i; j--) {
for (int k = 0; k < n; k++) {
printf("%3d %c", a[k], k != j - 1? ' ' : a[j - 1] > a[j] ? '+' : '-');
}
putchar('\n');
if (a[j - 1] > a[j]) {
swap(int, a[j - 1], a[j]);
count_swap++;
exg++;
}
count_cmp++;
}
for (int j = 0; j < n; j++) {
printf("%3d ", a[j]);
}
putchar('\n');
if (exg == 0) break;
}
printf("비교 횟수: %d / ", count_cmp);
printf("교환 횟수: %d\n", count_swap);
}
정답:
내 답변과 동일하다.
///*--- 버블 정렬(버전 2) ---*/
//void bubble(int a[], int n)
//{
// int i, j, m;
// int ccnt = 0; /* 비교 횟수 */
// int scnt = 0; /* 교환 횟수 */
//
// for (i = 0; i < n - 1; i++) {
// int exchg = 0;
// printf("패스%d:\n", i + 1);
//
// for (j = n - 1; j > i; j--) {
// for (m = 0; m < n - 1; m++)
// printf("%3d %c", a[m], (m != j - 1) ? ' ' :
// (a[j - 1] > a[j]) ? '+' : '-');
// printf("%3d\n", a[n - 1]);
//
// ccnt++;
// if (a[j - 1] > a[j]) {
// swap(int, a[j - 1], a[j]);
// exchg++;
// scnt++;
// }
// }
// for (m = 0; m < n; m++)
// printf("%3d ", a[m]);
// putchar('\n');
// if (exchg == 0) break; /* 교환하지 않으면 함수를 멈춥니다 */
// }
// printf("비교를 %d회 했습니다.\n", ccnt);
// printf("교환을 %d회 했습니다.\n", scnt);
//}'알고리즘 문제 풀이 > Do It! 자료구조와 함께 배우는 알고리즘 입문 C언어 편' 카테고리의 다른 글
| 5일차 (2) (0) | 2021.11.23 |
|---|---|
| 5일차 (1) (0) | 2021.11.23 |
| 4일차 (4) (0) | 2021.11.22 |
| 4일차 (3) (0) | 2021.11.22 |
| 4일차 (1) (0) | 2021.11.22 |
Comments