백준 2751 : 수 정렬하기 2

https://dojang.io/mod/page/view.php?id=638 

qsort에 대한 더 자세한 정보이다.

 

C 언어 코딩 도장: 73.2 퀵 정렬 함수 사용하기

이번에는 퀵 정렬 함수를 사용해보겠습니다. 퀵 정렬 함수에는 정렬할 배열 또는 메모리의 주소, 요소 개수, 요소 크기, 비교 함수를 넣어줍니다(stdlib.h 헤더 파일에 선언되어 있습니다). qsort(정

dojang.io

 

 

이전 문제와 같다고 생각하면 오산이다, 똑같은 코드 두번 넣어서 맞을 문제가 어디있겠냐고

이전 선택정렬을 사용한다면 백이면 백 시간오바로 틀린다

 

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