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 — указатель 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 в качестве третьего аргумента

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

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

Примечания

Несмотря на название, ни 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

См. также

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

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

Spec-Zone.ru

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