Пространства имён
Варианты
Действия

std::qsort

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
Модифицирующие линейные операции
Разделение
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
Библиотека C
qsort
 
Определено в заголовочном файле <cstdlib>
extern "C" void qsort( void *ptr, std::size_t count, std::size_t size,
            int (*comp)(const void *, const void *) );
extern "C++" void qsort( void *ptr, std::size_t count, std::size_t size,
            int (*comp)(const void *, const void *) );

Сортирует в порядке возрастания заданный массив, на который указывает ptr. Этот массив должен содержать count элементов, размером в size байт. Функция, заданная по указателю comp, используется для сравнения объектов.

Если функция comp определила, что два элемента одинаковые, то их порядок будет не определён.

Содержание

[править] Параметры

ptr - Указатель на массив для сортировки
count - Количество элементов в массиве
size - Размер каждого элемента в массиве
comp - Функция, которая будет сравнивать объекты. Она возвращает отрицательное целое число, если первый аргумент этой функции меньше второго, положительное число, если первый аргумент больше второго, и наконец если они равны, то она возвращает 0.

Определение сравнивающей функции должно быть следующим: int cmp(const void *a, const void *b);

Эта функция не должна модифицировать переданные ей объекты.

[править] Возвращаемое значение

(нет)

[править] Примечание

Несмотря на имя, стандарт С++, Си или POSIX не требует, чтобы эта функция реализовывала алгоритм "быстрой сортировки" или давала каких-то гарантий по стабильности и степени сложности алгоритма.

Тип элементов массива должен быть TrivialType (тривиальным типом), иначе поведение этой функции не определено.

Две перегрузки, предоставленные стандартной библиотекой C++ различны, так как типы параметра comp различны (языковое связывание является частью типа)

[править] Пример

Следующий код сортирует массив элементов int, используя qsort().

#include <iostream>
#include <cstdlib>
#include <climits>
 
int main()
{
    int a[] = {-2, 99, 0, -743, 2, INT_MIN, 4};
    constexpr std::size_t size = sizeof a / sizeof *a;
 
    std::qsort(a, size, sizeof *a, [](const void* a, const void* b)
    {
        int arg1 = *static_cast<const int*>(a);
        int arg2 = *static_cast<const int*>(b);
 
        if(arg1 < arg2) return -1;
        if(arg1 > arg2) return 1;
        return 0;
 
    //  return (arg1 > arg2) - (arg1 < arg2); // Возможное сокращение кода
    //  return arg1 - arg2; //Ошибочное сокращение (если присутствует INT_MIN)
    });
 
    for(int ai : a)
        std::cout << ai << ' ';
}

Вывод:

-2147483648 -743 -2 0 2 4 99

[править] См. также

Ищет в массиве элемент любого типа
(функция) [править]
сортирует диапазон в порядке возрастания
(шаблон функции) [править]
Проверяет является ли тип тривиальным или нет
(шаблон класса) [править]
C documentation for qsort