C
C언어 qsort 함수
꼬맹님
2025. 4. 14. 16:30
C언어 qsort 함수 완전 정리
1. qsort란?
- qsort(quick sort) : C 표준 라이브러리(stdlib.h)에 포함된 배열 정렬 함수입니다.
- 내부적으로 퀵 정렬을 사용하지만, 표준에서는 정렬 방법이 명시되어 있지 않습니다.
- 배열의 요소 타입, 정렬 기준을 직접 설정할 수 있어 범용성이 높습니다.
2. qsort 함수 원형
c
void qsort(void* base, size_t nitems, size_t size, int (*compar)(const void*, const void*));
매개변수설명
base | 정렬할 배열의 시작 주소 |
nitems | 배열 요소 개수 |
size | 배열 한 요소의 크기 (ex: sizeof(int)) |
compar | 두 요소를 비교하는 함수 포인터 |
3. compare 함수란?
- qsort가 정렬할 때 두 값을 비교하는 데 사용하는 함수입니다.
- 비교 함수 규칙:
- 양수 반환 → a가 b보다 크다
- 0 반환 → a와 b가 같다
- 음수 반환 → a가 b보다 작다
기본형
c
int compare(const void* a, const void* b) {
return *(int*)a - *(int*)b; // 오름차순
}
4. qsort 사용 예제
(1) int 배열 정렬
c
#include <stdio.h>
#include <stdlib.h>
int compare_int(const void* a, const void* b) {
return *(int*)a - *(int*)b; // 오름차순
}
int main() {
int arr[] = {5, 3, 2, 4, 1};
int n = sizeof(arr) / sizeof(arr[0]);
qsort(arr, n, sizeof(int), compare_int);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
출력
1 2 3 4 5
(2) char 배열 정렬
c
#include <stdio.h>
#include <stdlib.h>
int compare_char(const void* a, const void* b) {
return *(char*)a - *(char*)b; // 오름차순
}
int main() {
char arr[] = {'d', 'a', 'c', 'b', 'e'};
int n = sizeof(arr) / sizeof(arr[0]);
qsort(arr, n, sizeof(char), compare_char);
for (int i = 0; i < n; i++) {
printf("%c ", arr[i]);
}
return 0;
}
출력
a b c d e
5. 주의사항
- compare 함수에서 단순히 *(int*)a - *(int*)b 하면 overflow 위험이 있습니다.
(두 값 차이가 너무 크면 잘못된 결과가 나올 수 있음) - 보다 안전한 방법은 다음과 같습니다.
c
int compare_int_safe(const void* a, const void* b) {
int ia = *(int*)a;
int ib = *(int*)b;
if (ia > ib) return 1;
else if (ia < ib) return -1;
else return 0;
}
- 내림차순 정렬을 하고 싶으면 b - a 순서로 비교하면 됩니다.
c
int compare_desc(const void* a, const void* b) {
return *(int*)b - *(int*)a; // 내림차순
}
요약
- qsort는 배열을 빠르게 정렬하는 C언어 표준 라이브러리 함수입니다.
- 정렬 기준을 지정하는 compare 함수를 직접 만들어야 합니다.
- 다양한 타입(int, char, 구조체 등)에 적용할 수 있습니다.
- overflow 주의하며, 오름차순/내림차순 정렬을 자유롭게 설정할 수 있습니다.