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 주의하며, 오름차순/내림차순 정렬을 자유롭게 설정할 수 있습니다.