qsort, qsort_s
|
Определено в заголовочном файле
<stdlib.h>
|
||
| (1) | ||
|
errno_t qsort_s
(
void
*
ptr, rsize_t count, rsize_t size,
int
(
*
comp
)
(
const
void
*
,
const
void
*
,
void
*
)
,
|
(2) | (начиная с C11) |
-
- 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 в качестве третьего аргумента |
Возвращаемое значение
Примечания
Несмотря на название, ни стандарты 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
Смотрите также
|
(C11)
|
выполняет поиск элемента неопределенного типа в массиве
(функция) |
|
C++ documentation
для
qsort
|
|