https://dojang.io/mod/page/view.php?id=638
qsort에 대한 더 자세한 정보이다.
이전 문제와 같다고 생각하면 오산이다, 똑같은 코드 두번 넣어서 맞을 문제가 어디있겠냐고
이전 선택정렬을 사용한다면 백이면 백 시간오바로 틀린다
C언어를 하면서 없으면 다 본인이 만든 경험에 비추어, C에서 다른 정렬을 내가 구현할 생각에 머리가 아팠는데
놀랍게도 C언어에는 퀵 정렬이 함수로 존재한다.
바로 stdlib.h 헤더파일을 선언한 다음에 qsort라는 함수를 사용해서 쓸 수 있다.
qsort의 인자는 다음과 같다.
qsort(정렬할배열, 요소개수, 요소크기, 비교함수);
qsort(정렬할메모리주소, 요소개수, 요소크기, 비교함수);
void qsort(void *_Base, size_t _NumOfElements, size_t _SizeOfElements, int (*_PtFuncCompare)(void const *, void const *));
사실 위에껄로 해도 될텐데, 아래껄로 하면 더 범용성 있게 돌아간다고 한다.
비교 함수는 직접 만들어줘야한다.
qsort 내부 compare 함수의 인자 원형이 void const *이기 때문에, 우리는 이 자료를 우리가 받아온 int형으로 바꿔주기 위해서는 캐스팅이 필요하다.
따라서 a, b 값을 int 포인터 형으로 캐스팅 해준 뒤, 포인터를 하나 더 달아서 역참조한다. 그럼 값을 받아올 수 있다.
compare 함수만 완성한다면 사실상 qsort를 쓰는건 어렵지 않기 때문에 설명은 여기까지만 하겠다.
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
int num1 = *(int *)a;
int num2 = *(int *)b;
if (num1 < num2)
return -1;
if (num1 > num2)
return 1;
if (num1 == num2)
return 0;
}
int solve() {
int N, temp;
scanf("%d", &N);
int arr[N];
for(int i=0;i<N;i++)
scanf("%d", &arr[i]);
qsort(arr, sizeof(arr)/sizeof(int), sizeof(int), compare);
for(int i=0;i<N;i++)
printf("%d\n", arr[i]);
}
int main() {
solve();
return 0;
}
이번 문제는 사실상 풀었다기보단 스터디에 가깝다. 왜냐면 난 qsort 쓰는 방법을 몰랐기때문이다.
이번에 잘 배웠고 나중에 쏠쏠하게 써먹을 수 있을 것 같다.
'백준 (C99) > 정렬 (完)' 카테고리의 다른 글
백준 11650 : 좌표 정렬하기 (0) | 2022.02.06 |
---|---|
백준 1427 : 소트인사이드 (0) | 2022.02.05 |
백준 2108 : 통계학 (0) | 2022.02.05 |
백준 10989 : 수 정렬하기 3 (0) | 2022.02.05 |
백준 2750 : 수 정렬하기 (0) | 2022.02.03 |
Comment