1. 정렬 (Sorting)
정렬은 데이터 요소들을 일정한 순서(예: 오름차순 또는 내림차순)로 재배열하는 과정을 말합니다.
정렬은 데이터 검색, 분석, 시각화 등 다양한 분야에서 필수적인 작업입니다.
💡 버블 정렬
- 이웃한 두 개의 숫자를 비교해서 큰 수를 오른쪽으로 ‘밀어내는’ 정렬 방식.
- 이 과정을 여러 번 반복하면 가장 큰 수부터 순서대로 뒤로 가면서 정렬됨.
- 마치 물속에서 거품이 떠오르듯 큰 숫자가 위(오른쪽)로 밀려남 → 버블 정렬(Bubble Sort)
예제 코드: 버블 정렬 (Bubble Sort)
#include <stdio.h>
void bubbleSort(int arr[], int n) {
int temp;
for (int i = 0; i < n - 1; i++) { // 배열 전체를 반복하는 루프
for (int j = 0; j < n - i - 1; j++) { // 현재 요소와 다음 요소를 비교하는 루프
if (arr[j] > arr[j + 1]) { // 앞의 요소가 뒤의 요소보다 크면
temp = arr[j]; // 두 요소를 교환
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int data[] = {5, 2, 9, 1, 5, 6}; // 정렬할 배열
int size = sizeof(data) / sizeof(data[0]); // 배열의 크기 계산
bubbleSort(data, size); // 버블 정렬 함수 호출
printf("Sorted Array in Ascending Order:\n");
for (int i = 0; i < size; i++) {
printf("%d ", data[i]); // 정렬된 배열 출력
}
return 0;
}
- 배열 선언 및 초기화:
- int data[] = {5, 2, 9, 1, 5, 6};
- 정렬할 정수형 배열 data를 선언하고 초기화합니다.
- int data[] = {5, 2, 9, 1, 5, 6};
- 배열 크기 계산:
- int size = sizeof(data) / sizeof(data[0]);
- sizeof(data)는 배열 전체의 바이트 크기를 반환하고, sizeof(data[0])는 배열의 첫 번째 요소의 바이트 크기를 반환합니다. 이를 나누면 배열의 요소 개수를 얻을 수 있습니다.
- int size = sizeof(data) / sizeof(data[0]);
- 버블 정렬 함수 정의:
- void bubbleSort(int arr[], int n) { ... }
- 정렬할 배열 arr와 그 크기 n을 매개변수로 받는 bubbleSort 함수를 정의합니다.
- void bubbleSort(int arr[], int n) { ... }
- 첫 번째 루프 (외부 루프):
- for (int i = 0; i < n - 1; i++) { ... }
- 배열 전체를 반복하며, 각 반복마다 가장 큰 값이 배열의 끝으로 이동합니다.
- for (int i = 0; i < n - 1; i++) { ... }
- 두 번째 루프 (내부 루프):
- for (int j = 0; j < n - i - 1; j++) { ... }
- 현재 요소 arr[j]와 다음 요소 arr[j + 1]를 비교하여 정렬이 필요한 경우 교환합니다.
- for (int j = 0; j < n - i - 1; j++) { ... }
- 요소 교환:
- if (arr[j] > arr[j + 1]) { ... }
- 앞의 요소가 뒤의 요소보다 크면 두 요소를 교환하여 오름차순으로 정렬합니다.
- if (arr[j] > arr[j + 1]) { ... }
- 정렬된 배열 출력:
- for (int i = 0; i < size; i++) { ... }
- 정렬된 배열의 각 요소를 출력합니다.
- for (int i = 0; i < size; i++) { ... }
출력 결과:
Sorted Array in Ascending Order:
1 2 5 5 6 9
이러한 방식으로 버블 정렬을 구현하여 배열을 오름차순으로 정렬할 수 있습니다.
- i는 바깥쪽 반복 횟수 (전체 패스 수)
- j는 이웃한 두 수 비교
- 정렬이 완료되면 작은 수부터 순서대로 앞쪽에 정렬됨
2. 포인터 (Pointer)
포인터는 변수의 메모리 주소를 저장하는 변수입니다.
이를 통해 변수의 직접적인 값이 아닌, 그 변수의 위치를 가리킬 수 있습니다.
포인터는 C 언어에서 매우 강력하지만, 초보자에게는 다소 어려운 개념일 수 있습니다.
예제 코드: 포인터 기본 사용
#include <stdio.h>
int main() {
int var = 10; // 정수형 변수 var 선언 및 초기화
int *ptr; // 정수형 포인터 ptr 선언
ptr = &var; // ptr에 var의 주소를 저장
printf("var의 값: %d\n", var); // var의 값 출력
printf("var의 주소: %p\n", &var); // var의 주소 출력
printf("ptr이 가리키는 값: %d\n", *ptr); // ptr이 가리키는 값 출력
printf("ptr의 값(주소): %p\n", ptr); // ptr의 값(주소) 출력
return 0;
}
- 변수 선언 및 초기화:
- int var = 10;
- 정수형 변수 var를 선언하고 값 10으로 초기화합니다.
- int var = 10;
- 포인터 선언:
- int *ptr;
- 정수형 포인터 ptr을 선언합니다. 여기서 *는 포인터를 의미하며, ptr은 정수형 데이터를 가리키는 포인터입니다.
- int *ptr;
- 포인터에 주소 할당:
- ptr = &var;
- &var는 변수 var의 메모리 주소를 반환합니다. 이를 포인터 ptr에 할당하여 ptr이 var의 주소를 가리키도록 합니다.
- ptr = &var;
- 값 및 주소 출력:
- printf("var의 값: %d\n", var);
- 변수 var의 값을 출력합니다.
- printf("var의 주소: %p\n", &var);
- 변수 var의 메모리 주소를 출력합니다. %p는 포인터(주소)를 출력할 때 사용하는 형식 지정자입니다.
- printf("ptr이 가리키는 값: %d\n", *ptr);
- 포인터 ptr이 가리키는 주소의 값을 출력합니다. *ptr은 ptr이 가리키는 주소에 저장된 값을 의미합니다.
- printf("ptr의 값(주소): %p\n", ptr);
- 포인터 ptr 자체의 값을 출력합니다. 이는 var의 주소와 동일해야 합니다.
- printf("var의 값: %d\n", var);
출력 결과:
var의 값: 10
var의 주소
::contentReference[oaicite:0]{index=0}
int var = 10; | 정수형 변수 var에 10을 저장 |
int *ptr; | 포인터 ptr 선언 → "int형 데이터를 가리키는 주소 저장용 변수" |
ptr = &var; | var의 메모리 주소를 ptr에 저장 |
*ptr | 역참조 연산자: 포인터가 가리키는 실제 값을 가져옴 (*ptr은 10) |
&var | var의 메모리 주소를 반환 |
ptr | var의 주소를 담고 있으므로 &var와 같은 값을 출력함 |