0Pricing
C Academy · 강의

비교 함수와 qsort

표준 라이브러리 콜백을 알아봅니다

비교 함수와 qsort은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

표준 qsort

표준 라이브러리는 <stdlib.h>에서 qsort를 제공합니다. 비교 콜백을 사용하여 모든 배열 형식에 작동하는 일반 정렬 함수입니다.

#include <stdio.h>
#include <stdlib.h>

int cmp_int(const void *a, const void *b) {
    int x = *(const int *)a;
    int y = *(const int *)b;
    return (x > y) - (x < y);
}

int main(void) {
    int a[] = {3, 1, 2};
    qsort(a, 3, sizeof(int), cmp_int);
    printf("%d %d %d\n", a[0], a[1], a[2]);
    return 0;
}

qsort 시그니처

qsort(base, count, size, compare)는 배열의 시작 위치, 요소 개수, 요소 크기, 비교 함수를 받습니다.

원시 바이트와 사용자가 제공하는 비교 함수를 함께 사용하므로 일반적으로 작동합니다.

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b) {
    return *(const int*)a - *(const int*)b;
}

int main(void) {
    int a[] = {9, 4, 7, 1};
    qsort(a, 4, sizeof(int), cmp);
    for (int i = 0; i < 4; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

비교 함수의 규약

첫 번째 요소가 두 번째 요소보다 앞에 와야 하면 음수를, 같으면 0을, 뒤에 와야 하면 양수를 반환합니다.

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b) {
    int x = *(const int*)a, y = *(const int*)b;
    if (x < y) return -1;
    if (x > y) return 1;
    return 0;
}

int main(void) {
    int a[] = {5, 2, 8, 2};
    qsort(a, 4, sizeof(int), cmp);
    for (int i = 0; i < 4; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

void 포인터 형 변환

비교 함수는 각 요소를 const void *로 받습니다. 올바른 형식으로 형 변환한 후 역참조하여 값을 읽으십시오.

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b) {
    double x = *(const double*)a;
    double y = *(const double*)b;
    return (x > y) - (x < y);
}

int main(void) {
    double d[] = {2.5, 1.1, 3.3};
    qsort(d, 3, sizeof(double), cmp);
    printf("%.1f %.1f %.1f\n", d[0], d[1], d[2]);
    return 0;
}

내림차순

비교 결과를 반대로 하여 큰 값부터 작은 값 순으로 정렬하십시오.

#include <stdio.h>
#include <stdlib.h>

int desc(const void *a, const void *b) {
    int x = *(const int*)a, y = *(const int*)b;
    return (y > x) - (y < x);
}

int main(void) {
    int a[] = {1, 5, 3, 2};
    qsort(a, 4, sizeof(int), desc);
    for (int i = 0; i < 4; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

뺄셈 오버플로 방지

x - y를 반환하면 큰 정수에서 오버플로가 발생할 수 있습니다. 안전한 관용 표현인 (x > y) - (x < y)를 사용하면 이를 방지할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>

int safe_cmp(const void *a, const void *b) {
    int x = *(const int*)a, y = *(const int*)b;
    return (x > y) - (x < y);
}

int main(void) {
    int a[] = {100, -100, 0};
    qsort(a, 3, sizeof(int), safe_cmp);
    for (int i = 0; i < 3; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

문자열 정렬

char * 배열에서는 각 요소 자체가 포인터입니다. 따라서 const char * const *로 형 변환한 후 strcmp로 비교하십시오.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmp_str(const void *a, const void *b) {
    const char *sa = *(const char * const *)a;
    const char *sb = *(const char * const *)b;
    return strcmp(sa, sb);
}

int main(void) {
    const char *w[] = {"pear", "apple", "fig"};
    qsort(w, 3, sizeof(char*), cmp_str);
    for (int i = 0; i < 3; i++) printf("%s ", w[i]);
    printf("\n");
    return 0;
}

구조체 정렬

qsort는 구조체 배열도 처리할 수 있습니다. 비교 함수 내부에서 선택한 필드를 비교하십시오.

#include <stdio.h>
#include <stdlib.h>

typedef struct { char name; int age; } Person;

int by_age(const void *a, const void *b) {
    int x = ((const Person*)a)->age;
    int y = ((const Person*)b)->age;
    return (x > y) - (x < y);
}

int main(void) {
    Person p[] = {{'C',30},{'A',20},{'B',25}};
    qsort(p, 3, sizeof(Person), by_age);
    for (int i = 0; i < 3; i++) printf("%c:%d ", p[i].name, p[i].age);
    printf("\n");
    return 0;
}

bsearch도 같은 방식을 사용합니다

bsearch는 qsort와 같은 규약을 따르는 비교 함수를 사용하여 정렬된 배열에서 이진 검색을 수행합니다.

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b) {
    return (*(const int*)a) - (*(const int*)b);
}

int main(void) {
    int a[] = {1, 3, 5, 7, 9};
    int key = 7;
    int *found = bsearch(&key, a, 5, sizeof(int), cmp);
    printf("found: %d\n", found ? *found : -1);
    return 0;
}

여러 정렬 기준

비교 함수는 주요 필드를 비교한 다음, 주요 필드가 같을 때 보조 필드를 비교할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>

typedef struct { int grade; int id; } Rec;

int cmp(const void *a, const void *b) {
    const Rec *x = a, *y = b;
    if (x->grade != y->grade) return x->grade - y->grade;
    return x->id - y->id;
}

int main(void) {
    Rec r[] = {{90,2},{90,1},{80,3}};
    qsort(r, 3, sizeof(Rec), cmp);
    for (int i = 0; i < 3; i++) printf("%d/%d ", r[i].grade, r[i].id);
    printf("\n");
    return 0;
}

일반 정렬이 중요한 이유

qsort는 알고리즘과 비교를 분리하므로, 비교할 수 있는 모든 데이터 형식을 하나의 충분히 테스트된 함수로 정렬할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b) {
    char x = *(const char*)a, y = *(const char*)b;
    return (x > y) - (x < y);
}

int main(void) {
    char s[] = "dcba";
    qsort(s, 4, sizeof(char), cmp);
    printf("%s\n", s);
    return 0;
}

빠른 확인

qsort 비교 함수에 대한 이해도를 확인해 보십시오.

복습

비교 함수를 사용하여 qsort를 사용하는 방법을 배웠습니다:

  • qsort(base, count, size, compare)는 모든 배열을 일반적인 방식으로 정렬합니다.
  • 비교 함수는 두 개의 const void *를 받고 음수, 0 또는 양수를 반환합니다.
  • 오버플로를 방지하려면 (x > y) - (x < y)를 사용하십시오.
  • 같은 비교 함수 규약이 bsearch, 구조체 정렬 및 여러 기준 정렬에도 사용됩니다.

자주 묻는 질문

“비교 함수와 qsort” 강의는 무료인가요?

네 — “비교 함수와 qsort” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“비교 함수와 qsort”에서 뭘 배우나요?

표준 라이브러리 콜백을 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“비교 함수와 qsort” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 함수 포인터 선언
  2. 함수 전달
  3. 비교 함수와 qsort
  4. 함수 포인터 테이블
← C Academy(으)로 돌아가기