qsort 사용
표준 라이브러리 정렬을 알아봅니다
qsort 사용은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
표준 라이브러리 정렬
C의 표준 라이브러리는 qsort를 <stdlib.h>에서 제공합니다. 비교 함수가 주어지면 모든 배열을 정렬하므로 직접 정렬을 구현할 일이 거의 없습니다.
qsort 시그니처
프로토타입은 다음과 같습니다.
base첫 번째 원소를 가리키는 포인터nmemb원소 수size원소당 바이트 수compar비교 함수 포인터
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
비교 함수 작성
비교 함수는 두 개의 const void *를 받습니다. 이를 실제 형식으로 형 변환하고 역참조한 다음 음수, 0 또는 양수를 반환합니다.
#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); /* safe, no overflow */
}
int main(void) {
int a[] = {5, 2, 9, 1, 3};
qsort(a, 5, sizeof(int), cmp_int);
for (int i = 0; i < 5; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}비교 함수에서 뺄셈 피하기
x - y를 반환하면 큰 정수에서 오버플로가 발생해 잘못된 결과가 나올 수 있습니다. 대신 불리언 차이 관용구인 (x > y) - (x < y)를 사용하십시오.
#include <stdio.h>
int main(void) {
int x = 2000000000, y = -2000000000;
printf("unsafe x-y = %d\n", x - y); /* overflow */
printf("safe = %d\n", (x > y) - (x < y));
return 0;
}내림차순
내림차순으로 정렬하려면 비교 결과를 뒤집기만 하면 됩니다.
#include <stdio.h>
#include <stdlib.h>
int cmp_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[] = {5, 2, 9, 1, 3};
qsort(a, 5, sizeof(int), cmp_desc);
for (int i = 0; i < 5; 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 *x = *(const char * const *)a;
const char *y = *(const char * const *)b;
return strcmp(x, y);
}
int main(void) {
const char *names[] = {"charlie", "alice", "bob"};
qsort(names, 3, sizeof(char *), cmp_str);
for (int i = 0; i < 3; i++) printf("%s ", names[i]);
printf("\n");
return 0;
}구조체 정렬
구조체 배열은 어떤 필드를 기준으로든 정렬할 수 있습니다. 여기서는 사람을 나이순으로 정렬합니다.
#include <stdio.h>
#include <stdlib.h>
typedef struct { char name[16]; int age; } Person;
int by_age(const void *a, const void *b) {
const Person *p = a, *q = b;
return (p->age > q->age) - (p->age < q->age);
}
int main(void) {
Person ppl[] = {{"Ann", 30}, {"Ben", 25}, {"Cid", 40}};
qsort(ppl, 3, sizeof(Person), by_age);
for (int i = 0; i < 3; i++) printf("%s %d\n", ppl[i].name, ppl[i].age);
return 0;
}다중 키 정렬
동률을 해결하려면 첫 번째 필드가 같을 때 두 번째 필드를 비교합니다. 이렇게 하면 나이순으로 정렬한 뒤 이름을 알파벳순으로 정렬할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct { char name[16]; int age; } Person;
int cmp(const void *a, const void *b) {
const Person *p = a, *q = b;
if (p->age != q->age)
return (p->age > q->age) - (p->age < q->age);
return strcmp(p->name, q->name);
}
int main(void) {
Person ppl[] = {{"Zoe", 30}, {"Amy", 30}, {"Bo", 25}};
qsort(ppl, 3, sizeof(Person), cmp);
for (int i = 0; i < 3; i++) printf("%d %s\n", ppl[i].age, ppl[i].name);
return 0;
}qsort는 안정적이지 않음
C 표준은 qsort가 안정적일 것을 요구하지 않습니다. 안정성이 필요하다면 원래 인덱스와 같은 동률 해결용 키를 비교 함수에 추가하십시오.
bsearch 동반 함수
bsearch는 같은 비교 함수 형식을 사용하여 정렬된 배열에서 이진 검색을 수행합니다. 빠른 조회를 위해 qsort와 함께 사용하십시오.
#include <stdio.h>
#include <stdlib.h>
int cmp_int(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[] = {1, 3, 5, 7, 9};
int key = 7;
int *found = bsearch(&key, a, 5, sizeof(int), cmp_int);
printf("%s\n", found ? "found" : "missing");
return 0;
}qsort를 사용하는 이유
표준 qsort는 충분히 테스트되었고, 흔히 성능이 조정된 인트로 정렬 하이브리드이며, 어떤 형식에도 사용할 수 있습니다. 라이브러리가 제공할 수 없는 안정성이나 특수 동작이 필요할 때만 직접 정렬을 구현하십시오.
빠른 확인
qsort에 대한 이해도를 확인해 보십시오.
복습
표준 라이브러리 정렬을 사용하는 방법을 배웠습니다.
qsort(base, nmemb, size, compar)는 모든 배열을 정렬합니다.- 비교 함수는
const void *를 형 변환하고 비교 결과의 부호를 반환합니다. - 뺄셈을 피하고
(x > y) - (x < y)를 사용하십시오. qsort의 안정성은 보장되지 않으며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개 중 4번째 강의입니다.
“qsort 사용” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 버블 정렬과 삽입 정렬
- 퀵 정렬
- 병합 정렬
- qsort 사용