언어/C&C++ 응용
[C] 정렬: qsort()
차가운오미자
2021. 9. 7. 11:30
C에서 기본 제공하는 정렬함수: qsort()
- quick sort를 기반으로 함
- stdlib.h 헤더 include 해야 함
- 레퍼런스: https://en.cppreference.com/w/c/algorithm/qsort
qsort, qsort_s - cppreference.com
void qsort( void *ptr, size_t count, size_t size, int (*comp)(const void *, const void *) ); (1) errno_t qsort_s( void *ptr, rsize_t count, rsize_t size, int (*comp)(const void *, const void *, void *),
en.cppreference.com
void qsort( void *ptr, size_t count, size_t size, int (*comp)(const void *, const void *) );
- ptr: 정렬할 값들이 있는 위치
- count: 요소의 개수 (배열의)
- size: 각 요소의 size
- comp: 정렬 기준 함수
정렬 함수는 다음과 같은 형식을 가진다
int cmp(const void *a, const void *b);
- 만약 a 가 b 보다 작으면 음수의 값을 리턴하고,
- 만약 a 가 b 보다 크면 양수의 값을 리턴한다.
- 만약 a와 b가 같으면 0을 리턴한다.
사용 예시
int compare_int(void * a, void * b)
{
// void* 로 인자를 받기 때문에, 사용시에 type-casting이 필요하다
int *p1 = (int *)a;
int *p2 = (int *)b;
return *p1 - *p2;
/*
if(*p1 > *p2) return 1;
else if(*p1 < *p2) return -1;
else return 0;
*/
}
int main(void){
int a[10] = {2, 4, 1, 6, 5, 6, 9, 0, 7, 8};
qsort(a, 10, sizeof(int), compare_int); // 인자로 전달된 함수의 return 이 1일 때 swap
for(int i = 0; i<10; i++){
printf("%d ", a[i]);
}
}
+) GCC 컴파일러 사용할 때, compare_int의 paremeter들 다 const void* 형으로 선언해줘야 함.
int compare_int(const void * a, const void * b)
{
// void* 로 인자를 받기 때문에, 사용시에 type-casting이 필요하다
int *p1 = (int *)a;
int *p2 = (int *)b;
if(*p1 > *p2) return 1;
else if(*p1 < *p2) return -1;
else return 0;
}
int main(void){
int a[10] = {2, 4, 1, 6, 5, 6, 9, 0, 7, 8};
qsort(a, 10, sizeof(int), compare_int); // 인자로 전달된 함수의 return 이 1일 때 swap
for(int i = 0; i<10; i++){
printf("%d ", a[i]);
}
}