Namespaces
Variants

qsort, qsort_s

From cppreference.net
헤더 파일에 정의됨 <stdlib.h>
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 * ) ,

void * context ) ;
(2) (C11부터)
1) 주어진 배열을 ptr 가 가리키는 위치부터 오름차순으로 정렬합니다. 배열은 count 개의 원소를 포함하며, 각 원소의 크기는 size 바이트입니다. comp 가 가리키는 함수는 객체 비교에 사용됩니다.
2) (1) 과 동일하지만, 추가적인 컨텍스트 매개변수 context comp 에 전달되며, 런타임에 다음 오류들이 감지되어 현재 설치된 constraint handler 함수를 호출합니다:
  • count 또는 size RSIZE_MAX 보다 큰 경우
  • ptr 또는 comp 가 널 포인터인 경우 ( count 가 0이 아닌 경우)
모든 경계 검사 함수와 마찬가지로, qsort_s 는 구현에 의해 __STDC_LIB_EXT1__ 가 정의되고 사용자가 <stdlib.h> 를 포함하기 전에 __STDC_WANT_LIB_EXT1__ 를 정수 상수 1 로 정의한 경우에만 사용 가능함이 보장됩니다.

만약 comp 가 두 요소를 동등하다고 표시하면, 결과 정렬된 배열에서의 순서는 명시되지 않습니다.

목차

매개변수

ptr - 정렬할 배열에 대한 포인터
count - 배열의 요소 개수
size - 배열 내 각 요소의 바이트 단위 크기
comp - 비교 함수로, 첫 번째 인수가 두 번째 인수보다 작으면 음의 정수 값을, 첫 번째 인수가 두 번째 인수보다 크면 양의 정수 값을, 인수들이 동등하면 0을 반환합니다.

비교 함수의 시그니처는 다음과 동일해야 합니다:

int cmp ( const void * a, const void * b ) ;

이 함수는 전달된 객체를 수정해서는 안 되며, 배열 내 위치에 관계없이 동일한 객체에 대해 호출될 때 일관된 결과를 반환해야 합니다.

context - 추가 정보(예: 정렬 순서)로, comp 에 세 번째 인수로 전달됨

반환값

1) (없음)
2) 성공 시 0, 런타임 제약 조건 위반이 감지된 경우 0이 아닌 값

참고 사항

이름과는 달리, C나 POSIX 표준은 이 함수가 quicksort 를 사용하여 구현되도록 요구하지 않으며, 어떠한 복잡도나 안정성 보장도 하지 않습니다.

다른 경계 검사 함수들과 달리, qsort_s 는 크기가 0인 배열을 런타임 제약 조건 위반으로 처리하지 않으며, 대신 배열을 변경하지 않고 성공적으로 반환합니다(크기가 0인 배열을 허용하는 다른 함수는 bsearch_s 입니다).

qsort_s 의 구현은 Windows CRT 에서 C 표준과 호환되지 않습니다. Microsoft 버전은 다음과 같이 선언됩니다: void qsort_s ( void * base, size_t num, size_t width,
int ( * compare ) ( void * , const void * , const void * ) , void * context ) ;
. 이 함수는 값을 반환하지 않으며, 비교 함수는 표준과 관련하여 매개변수 순서가 반전되어 있습니다: context 가 먼저 전달됩니다.

예제

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
int compare_ints(const void* a, const void* b)
{
    int arg1 = *(const int*)a;
    int arg2 = *(const int*)b;
    if (arg1 < arg2) return -1;
    if (arg1 > arg2) return 1;
    return 0;
    // return (arg1 > arg2) - (arg1 < arg2); // possible shortcut
    // return arg1 - arg2; // erroneous shortcut: undefined behavior in case of
                           // integer overflow, such as with INT_MIN here
}
int main(void)
{
    int ints[] = {-2, 99, 0, -743, 2, INT_MIN, 4};
    int size = sizeof ints / sizeof *ints;
    qsort(ints, size, sizeof(int), compare_ints);
    for (int i = 0; i < size; i++)
        printf("%d ", ints[i]);
    printf("\n");
}

출력:

-2147483648 -743 -2 0 2 4 99

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.22.5.2 The qsort 함수 (p: TBD)
  • K.3.6.3.2 The qsort_s 함수 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.22.5.2 The qsort function (p: 258-259)
  • K.3.6.3.2 The qsort_s function (p: 442-443)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.22.5.2 The qsort function (p: 355-356)
  • K.3.6.3.2 The qsort_s function (p: 609)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.20.5.2 qsort 함수 (p: 319)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.10.5.2 qsort 함수

참고 항목

지정되지 않은 타입의 요소를 배열에서 검색합니다
(함수)