Vienna

4일차 (3) 본문

Q5. 연습문제 Q2(204쪽)와 마찬가지로 비교, 교환 과정을 자세히 출력하는 프로그램(실습 6-3)으로 수정하세요.

내 답변:

6-3과 같이 key와 last 변수를 추가했다. 그리고 교환이 일어날 때마다 last를 업데이트 하게 했다. 그래서 해당 패스에서 교환이 일어난 가장 작은 인덱스를 저장한다. 그럼 진행중인 패스의 검사를 마쳤을 때 a[0]부터 a[last] 까지는 정렬된 상태일 것이다. 즉, 다음 패스에서 그 사이의 인덱스는 검사할 필요가 없다.

하지만 last 변수는 다음 패스에서 다시 초기화가 진행되기 때문에 패스가 끝나기 전에 key 변수에 last의 값을 대입시킨다. 그리고 매 패스는 key까지만 검사를 진행하게 된다.

void bubble(int a[], int n) {
	int i, j;
	int ccnt = 0;
	int scnt = 0;
	int key = 0;
	for (i = 0; i < n - 1; i++) {
		int last = n - 1;
		printf("패스%d:\n", i + 1);
		for (j = n - 1; j > key; j--) {
			for (int k = 0; k < n - 1; k++)
				printf("%3d %c", a[k], (k != j - 1) ? ' ' : (a[j - 1] > a[j]) ? '+' : '-');
			printf("%3d\n", a[n - 1]);
			ccnt++;
			if (a[j - 1] > a[j]) {
				scnt++;
				swap(int, a[j - 1], a[j]);
				last = j;
			}
			putchar('\n');
		}
		for (int k = 0; k < n; k++)
			printf("%3d  ", a[k]);
		putchar('\n');
		key = last;
	}
	printf("비교 %d회\n", ccnt);
	printf("교환 %d회\n", scnt);
}

 


정답:

///*--- 버블 정렬(버전 3) ---*/
//void bubble(int a[], int n)
//{
//	int i = 0, m;
//	int ccnt = 0;		
//	int scnt = 0;		
//	int k = 0;			/* a[k] 이전은 정렬된 상태 */
//
//	while (k < n - 1) {
//		int j;
//		int last = n - 1;					/* 마지막으로 교환한 위치 */
//
//		printf("패스%d:\n", ++i);
//		for (j = n - 1; j > k; 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]);
//				last = j;
//				scnt++;
//			}
//		}
//		k = last;
//		for (m = 0; m < n; m++)
//			printf("%3d  ", a[m]);
//		putchar('\n');
//	}
//	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일차 (2)  (0) 2021.11.22
4일차 (1)  (0) 2021.11.22
Comments