비교 함수와 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 함수 포인터 선언
- 함수 전달
- 비교 함수와 qsort
- 함수 포인터 테이블