언어/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]);
	}
}

'언어 > C&C++ 응용' 카테고리의 다른 글

[C++] upper_bound, lower_bound  (0) 2021.09.11
[C++] vector iterator, unique사용  (0) 2021.09.11
[C++] std::sort()  (0) 2021.09.06
[C] 특수 입력  (0) 2021.08.24
[C] Visual Studio 경고 레벨 높이기  (0) 2021.08.11