1. qsort() 함수란?
- qsort()는 C 표준 라이브러리(stdlib.h)에서 제공하는 퀵 정렬(Quick Sort) 기반의 정렬 함수이다.
- 배열의 원소를 정렬하는 데 사용되며, 정수, 실수, 구조체 등 다양한 자료형을 정렬할 수 있다.
- 사용자가 직접 비교 함수를 정의하여 원하는 기준으로 정렬할 수 있는 것이 큰 특징이다.
2. qsort() 함수 원형
#include <stdlib.h>
void qsort(void *base, size_t num, size_t size, int (*compare)(const void *, const void *));
2.1 매개변수 설명
base | 정렬할 배열의 시작 주소 |
num | 배열의 요소 개수 |
size | 배열의 각 요소 크기(바이트 단위) |
compare | 요소를 비교하는 함수의 포인터 |
3. compar 비교 함수의 역할
- qsort()가 올바르게 정렬되려면 비교 함수(compare)를 사용자가 직접 정의해야 한다.
- 이 함수는 두 개의 요소를 비교하여 오름차순 또는 내림차순 정렬을 결정한다.
- 비교 함수의 반환값:
- 음수 (a < b): 첫 번째 값이 두 번째 값보다 작으면 유지
- 0 (a == b): 두 값이 같으면 그대로 둠
- 양수 (a > b): 첫 번째 값이 두 번째 값보다 크면 위치 변경
4. qsort() 사용 예제
4.1 정수 배열 오름차순 정렬
#include <stdio.h>
#include <stdlib.h>// 비교 함수 (오름차순 정렬)
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int main() {
int arr[] = {5, 2, 9, 1, 7};
int size = sizeof(arr) / sizeof(arr[0]);
qsort(arr, size, sizeof(int), compare);
printf("정렬된 배열: ");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
return 0;
}
정렬된 배열: 1 2 5 7 9
4.2 정수 배열 내림차순 정렬
int compare_desc(const void *a, const void *b) {
return (*(int*)b - *(int*)a); // 순서를 반대로
}
4.3 실수 배열 정렬
#include <stdio.h>
#include <stdlib.h>
int compare_float(const void *a, const void *b) {
if (*(float*)a > *(float*)b) return 1;
if (*(float*)a < *(float*)b) return -1;
return 0;
}
int main() {
float arr[] = {3.2, 1.5, 4.7, 2.1};
int size = sizeof(arr) / sizeof(arr[0]);
qsort(arr, size, sizeof(float), compare_float);
printf("정렬된 실수 배열: ");
for (int i = 0; i < size; i++) {
printf("%.1f ", arr[i]);
}
return 0;
}
정렬된 실수 배열: 1.5 2.1 3.2 4.7
4.4 구조체 정렬
- 구조체 배열을 특정 기준(예: 이름, 나이)으로 정렬하는 예제이다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[20];
int age;
} Person;
// 나이 기준 오름차순 정렬
int compare_age(const void *a, const void *b) {
return ((Person*)a)->age - ((Person*)b)->age;
}
int main() {
Person people[] = {{"Alice", 25}, {"Bob", 20}, {"Charlie", 30}};
int size = sizeof(people) / sizeof(people[0]);
qsort(people, size, sizeof(Person), compare_age);
printf("정렬된 구조체 배열 (나이순):\\n");
for (int i = 0; i < size; i++) {
printf("%s: %d세\\n", people[i].name, people[i].age);
}
return 0;
}
정렬된 구조체 배열 (나이순):
Bob: 20세
Alice: 25세
Charlie: 30세
5. qsort()를 사용할 때 주의할 점
- 정렬할 배열이 반드시 같은 크기의 요소들로 이루어져 있어야 한다.
- 비교 함수는 반드시 const void * 타입의 매개변수를 받아야 한다.
- 비교 함수 내에서 포인터를 강제 형변환((int*)a)하여 올바르게 값을 참조해야 한다.
- 음수, 0, 양수 값을 올바르게 반환하도록 비교 함수를 설계해야 한다.
- qsort()는 제네릭 함수이므로 다양한 자료형을 다룰 수 있지만, 반드시 사용자가 적절한 비교 함수를 작성해야 한다.
참고 자료
https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/qsort?view=msvc-170
'Language > C' 카테고리의 다른 글
for 문에서의 strlen (0) | 2025.03.24 |
---|