아는개발자 2021. 11. 23. 23:15

Q9. 단순 삽입 정렬에서 배열의 첫 요소부터 데이터를 저장하지 않고 a[1]부터 데이터를 저장하면 a[0]을 보초로 하여 삽입을 마치는 조건을 줄일 수 있습니다. 이 아이디어를 적용한 단순 삽입 정렬 함수를 수정하세요.

내 답변: 

void insertion(int a[], int n) {
	int j;

	for (int i = 1; i < n; i++) {
		int tmp = a[i];
		a[0] = a[i];
		for (j = i; a[j - 1] > tmp; j--)
			a[j] = a[j - 1];
		if (j!=0) a[j] = tmp;
	}
}

정답:

int tmp=a[0]=a[i]; 대입을 한 줄로 깔끔하게 할 수 있단 걸 계속 잊는다. 기억하자.

그리고 그냥 if(j)라고 썼네. 더 짧게 코드를 쓸 수 있어서 좋다. 이해하기 어려울 것 같으면 옆에 주석을 달아놔도 되니까.

//void insertion(int a[], int n)
//{
//	int i, j;
//
//	for (i = 1; i < n; i++) {
//		int tmp = a[0] = a[i];
//		for (j = i; a[j - 1] > tmp; j--)
//			a[j] = a[j - 1];
//		if (j) a[j] = tmp;
//	}
//}