본문 바로가기
IT/programming

[C/C++] 오름차순 정렬, 내림차순 정렬 C언어, qsort 활용

by 어느해겨울 2022. 1. 10.

 

 

[C/C++] 오름차순 정렬, 내림차순 정렬 C언어, qsort 활용


qsort 함수를 이용한 오름차순/내림차순 정렬 함수 구현을 해보자.
qsort는 quick sort의 약자로 배열을 정렬하는 함수이다.

quick sort에 대해 간단히 설명하면 원소와 다른 원소의 비교로 정렬하는 비교 정렬이다.

출처: https://ko.wikipedia.org/wiki/퀵_정렬

알고리즘적인 내용을 터치할 건 아니니 바로 함수 원형과 사용법을 알아보자.



qsort 헤더 및 원형

#include <stdlib.h>

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

qsort 함수의 인자를 쉽게 풀이해보면 다음처럼 이해하면 쉬울 것이다.
qsort(<배열의 주소>, <배열의 개수>, <데이터형의 사이즈>, <비교를 위한 콜백 함수>)

꼭 정수 배열일 필요는 없다. void 포인터를 사용하기 때문에 정수, 실수, 문자열 모두 비교가 가능하다.
그중 정수 배열에 대한 정렬만 해보겠다. 다른 데이터형 역시 기존 동작의 응용이니 크게 어려울 게 없다.

소스코드

#include <stdio.h> 
#include <stdlib.h> 

// 오름차순 정렬 
int func_compare(const void *_a, const void *_b) { 
    return (*(int *)_a - *(int *)_b); 
} 

// 내림차순 정렬 
int func_compare_r(const void *_a, const void *_b) { 
    return (*(int *)_b - *(int *)_a); 
} 

// 배열 출력 함수 
void print_array(int _arr_target[], int _size) { 
    printf("["); 
    for( int idx = 0 ; idx < _size ; idx++ ) { 
        printf("%d", _arr_target[idx]); 
        if( idx + 1 < _size ) { 
            printf(", "); 
        } 
    } 
    printf("]\n"); 
    
    return ; 
} 

int main(int _argc, char *_argv[]) { 
    int arr_int[] = {11, 21, 3, 43, 6, 12}; 
    int num_arr = sizeof(arr_int) / sizeof(int); 

    // 오름차순 정렬 및 출럭 
    qsort(&arr_int, num_arr, sizeof(int), func_compare); 
    print_array(arr_int, num_arr); 
    
    // 내림차순 정렬 
    qsort(&arr_int, num_arr, sizeof(int), func_compare_r); 
    print_array(arr_int, num_arr); 
 
    return 0; 
}

오름차순과 내림차순의 차이는 원소와 다른 원소를 비교할 때 어느 원소가 기준이 되는지 차이 밖에 없다.

결과

[3, 6, 11, 12, 21, 43] [43, 21, 12, 11, 6, 3]


qsort 함수의 자세한 내용은 man page 를 참고하자.
https://linux.die.net/man/3/qsort

 

qsort(3): sort array - Linux man page

qsort(3) - Linux man page Name qsort, qsort_r - sort an array Synopsis #include void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); void qsort_r(void *base, size_t nmemb, size_t size, int (*compar)(const void *, co

linux.die.net


끝.

댓글