라떼는말이야

[C 기초] 포인터를 이용한 버블 정렬 본문

알고리즘/CS50

[C 기초] 포인터를 이용한 버블 정렬

MangBaam 2021. 3. 14. 10:00
반응형

www.notion.so/3-37cf1ef82d3a4ac7ace7f745dc88b32b

 

✔︎ 미션 3.

1. 미션 제목

www.notion.so

1. 미션 제목

정렬을 해보자

2. 지시문

여러분은 데이터를 정리하기 위해서 엑셀을 많이 사용하실 것입니다. 게다가, 데이터들을 보기 좋게 하기 위해서 정렬 기능을 많이 사용하실 텐데 간단한 버블 정렬 코드를 배열이 아닌 포인터를 활용하여 완성해 보세요.

예) main code는 다음과 같습니다. sort function 을 완성해보세요

 

int main() 
{ 
    int n = 7; 
    int arr[7] = { 0, 25, 10, 17, 6, 12, 9 }; 
    sort(n, arr); 
		return 0; 
}

출력값 : 0, 6, 9, 10, 12, 17, 25

 

3. 핵심 개념

#sort #bubblesort #버블정렬

 

나의 풀이

#include<stdio.h> 

void swap(int*, int*);
void sort(int, int*);

int main() {
	int n = 7;
	int arr[7] = { 0, 25, 10, 17, 6, 12, 9 };
	sort(n, arr);

	// 정렬 이후 arr배열 값 출력
	for (int i = 0; i < n; i++) {
		printf("%d  ", arr[i]);
	} printf("\n");

	return 0;
}

// a <-> b
void swap(int* a, int* b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}

// Bubble sort
void sort(int n, int* arr) {
	int flag = 0;
	for (int i = n - 1; i > 0; i--) {
		for (int j = 0; j < i; j++) {
			// arr[1]와 *(arr+1)은 값, &arr[1]와 arr+1은 주소이다.
			if (*(arr + j) > *(arr + j + 1)) {
				swap(arr + j, arr + j + 1);
				flag = 1;
			}
		}
		// 정렬된 배열이 입력되면 바로 종료
		if (flag == 0) return;
		flag = 0;
	}
}

이 문제에서 가장 잘 확인해야 하는 개념은

 

arr[1] = *(arr + 1) = 값,
&arr[1] = arr + 1 = 주소

이다.

 

즉 포인터를 사용하여 j번째 값과 j+1번째 값을 비교하려면 *(arr + j) 와 *(arr + j + 1)을 비교해야 하고, 두 값을 바꿔주려면 swap 함수에 두 인덱스의 주소를 넘겨주면서 스왑해야 하기 때문에 주소값인 arr + j 와 arr + j + 1을 swap 함수의 인자 값으로 입력한다.

 

swap함수에서 주소 값을 이용하는 이유는 만약 주소 값이 아닌 그냥 int 값을 넘겨준다면 swap 함수 내부에서 값이 변경될지라도 그 값들은 복사 된 값들이기 때문에 swap 함수를 빠져나오면 원래의 arr 배열 값은 변경이 반영되지 않는다.

 

그렇기 때문에 주소를 이용해서 직접 두 값을 바꿔주는 것이고, 이 방식을 Call by address라고 칭한다. (위와 같이 값을 넘겨주는 경우는 Call by reference라고 칭한다)

반응형
Comments