Spec-Zone.ru › C

qsort, qsort_s

Определено в заголовочном файле <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 - функция сравнения, которая возвращает отрицательное целое значение, если первый аргумент меньше второго, положительное целое значение, если первый аргумент больше второго, и ноль, если аргументы эквивалентны.

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

intcmp(constvoid*a,constvoid*b);

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

​

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

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

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

Примечания

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

В отличие от других функций с проверкой границ, 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

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/algorithm/qsort

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API