qsort - Quick sort in c

2022. 7. 5. 13:07STUDY/알고리즘

반응형

stdlib.h 에서 지원하는 qsort 가 있다고한다..

난 여태... 뭘 배운거죠 ...?

허허...

#include <stdio.h>
#include <stdlib.h>    // qsort 함수가 선언된 헤더 파일

int compare(const void *a, const void *b)    // 오름차순 비교 함수 구현
{
    int num1 = *(int *)a;    // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴
    int num2 = *(int *)b;    // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴

    if (num1 < num2)    // a가 b보다 작을 때는
        return -1;      // -1 반환
    
    if (num1 > num2)    // a가 b보다 클 때는
        return 1;       // 1 반환
    
    return 0;    // a와 b가 같을 때는 0 반환
}

int main()
{
    int numArr[10] = { 8, 4, 2, 5, 3, 7, 10, 1, 6, 9 };    // 정렬되지 않은 배열

    // 정렬할 배열, 요소 개수, 요소 크기, 비교 함수를 넣어줌
    qsort(numArr, sizeof(numArr) / sizeof(int), sizeof(int), compare);

    for (int i = 0; i < 10; i++)
    {
        printf("%d ", numArr[i]);    // 1 2 3 4 5 6 7 8 9 10
    }

    printf("\n");

    return 0;
}

qsort 를 사용하기전에, compare 함수를 만들어야한다. 

오름차수 정렬 조건은 다음과 같다.

* a < b 일 때는, -1을 반환

* a > b 일 때는, 1을 반환

* a == b 일 때는, 0을 반환.

이것의 반대는 내림차순 정렬 조건이다. 

int compare(const void *a, const void *b)    // 오름차순 비교 함수 구현
{
    int num1 = *(int *)a;    // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴
    int num2 = *(int *)b;    // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴

    if (num1 < num2)    // a가 b보다 작을 때는
        return -1;      // -1 반환
    
    if (num1 > num2)    // a가 b보다 클 때는
        return 1;       // 1 반환
    
    return 0;    // a와 b가 같을 때는 0 반환
}

오름차순 compare 함수이다.

더 간단하게 하려면, 

int compare(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;    // 오름차순
}

int compare(const void *a, const void *b)
{
    return *(int *)b - *(int *)a;    // 내림차순
}

즉, 꼭 return 값이 -1, 1, 0 일 필요는 없다! 

값이 같을 때만 0이면 되고, 값이 크거나 작을 때는 음수와 양수를 반환하면 된다. ! 

 

 

 

728x90
반응형

'STUDY > 알고리즘' 카테고리의 다른 글

Adjacency list in C  (0) 2022.07.30
About Graph & BFS,DFS  (0) 2022.07.18
백준 2579 - 계단 오르기  (0) 2022.07.03
백준 1463번 - 1로 만들기  (0) 2022.07.02
백준 2748 - fibonacci 2  (1) 2022.07.02