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 , и что следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную функцию обработки ограничений :
  • count или size больше RSIZE_MAX
  • ptr или comp является нулевым указателем (если только count не равен нулю)
Как и все функции с проверкой границ, qsort_s гарантированно доступна только если __STDC_LIB_EXT1__ определено реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <stdlib.h> .

Если comp указывает, что два элемента эквивалентны, их порядок в результирующем отсортированном массиве не определён.

Содержание

Параметры

ptr - указатель на массив для сортировки
count - количество элементов в массиве
size - размер каждого элемента массива в байтах
comp - функция сравнения, которая возвращает отрицательное целое значение, если первый аргумент меньше второго, положительное целое значение, если первый аргумент больше второго, и ноль, если аргументы эквивалентны.

Сигнатура функции сравнения должна быть эквивалентна следующей:

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

Функция не должна изменять переданные ей объекты и должна возвращать согласованные результаты при вызове для одних и тех же объектов, независимо от их позиций в массиве.

context - дополнительная информация (например, последовательность сравнения), передаваемая в comp в качестве третьего аргумента

Возвращаемое значение

1) (нет)
2) ноль при успешном выполнении, ненулевое значение при обнаружении нарушения ограничений времени выполнения

Примечания

Несмотря на название, ни стандарты C, ни стандарты POSIX не требуют, чтобы эта функция была реализована с использованием quicksort и не дают никаких гарантий относительно сложности или стабильности.

В отличие от других функций с проверкой границ, qsort_s не рассматривает массивы нулевого размера как нарушение ограничений времени выполнения и вместо этого успешно возвращается без изменения массива (другая функция, которая принимает массивы нулевого размера, это 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 Функция qsort (стр.: TBD)
  • K.3.6.3.2 Функция qsort_s (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.22.5.2 Функция qsort (стр. 258-259)
  • K.3.6.3.2 Функция qsort_s (стр. 442-443)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.22.5.2 Функция qsort (стр. 355-356)
  • K.3.6.3.2 Функция qsort_s (стр. 609)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.20.5.2 Функция qsort (стр. 319)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.10.5.2 Функция qsort

Смотрите также

выполняет поиск элемента неопределенного типа в массиве
(функция)
C++ documentation для qsort