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— указатель NULL (если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 в качестве третьего аргумента |
Возвращаемое значение
Примечания
Несмотря на название, ни C, ни стандарты POSIX не требуют, чтобы эта функция была реализована с использованием быстрой сортировки или гарантировали какие-либо характеристики сложности или устойчивости.
В отличие от других функций с проверкой границ, qsort_s не обрабатывает массивы нулевого размера как ошибку во время выполнения, а вместо этого возвращает успех, не изменяя массив (другая функция, которая принимает массивы нулевого размера, это bsearch_s).
До qsort_s, пользователи qsort часто использовали глобальные переменные для передачи дополнительного контекста функции сравнения.
Пример
#include <stdio.h>
#include <stdlib.h>
#include <limits.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 (fails if INT_MIN is present)
}
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
Ссылки
- Стандарт 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/w/c/algorithm/qsort