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) |
ptr, в порядке возрастания. Массив содержит count элементов размером size байт. Для сравнения объектов используется функция, на которую указывает comp.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 в качестве третьего аргумента |
Возвращаемое значение
Примечания
Несмотря на название, стандарты 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
См. также
|
(C11) | выполняет поиск элемента неизвестного типа в массиве (функция) |
Документация по C++ для qsort |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/algorithm/qsort