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

std::sort

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами(C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Политики исполнения (C++17)
Немодифицирующие операции над последовательностями
(C++11)(C++11)(C++11)
(C++17)
Модифицирующие операции над последовательностями
Операции разбиения
Операции сортировки
Операции двоичного поиска
Операции с наборами (в отсортированных диапазонах)
Операции с кучей
(C++11)
Операций минимума/максимума
(C++11)
(C++17)

Операции перестановки
Числовые операции
Операции с неинициализированной памятью
(C++17)
(C++17)
(C++17)
Библиотека C
 

Содержание

[править]Объявление

Определено в заголовочном файле <algorithm>
template<class RandomIt >
void sort( RandomIt first, RandomIt last );
(1) (constexpr начиная с C++20)
template<class ExecutionPolicy, class RandomIt >

void sort( ExecutionPolicy&& policy,

           RandomIt first, RandomIt last );
(2) (начиная с C++17)
template<class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
(3) (constexpr начиная с C++20)
template<class ExecutionPolicy, class RandomIt, class Compare >

void sort( ExecutionPolicy&& policy,

           RandomIt first, RandomIt last, Compare comp );
(4) (начиная с C++17)

[править]Описание

Сортировка элементов в диапазоне [firstlast) в порядке "возрастания". Сохранность порядка элементов, имеющих одинаковое значение, не гарантируется.

1,2) Элементы сортируются с помощью operator<(до C++20)std::less{}(начиная с C++20).
3,4) Элементы сортируются с помощью comp.
2,4) Соответствуют (1,3), но исполнение контролирует policy.
Эти перегрузки не участвуют в разрешении перегрузки, если только

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> не равно true.

(до C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> не равно true.

(начиная с C++20)

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

[firstlast) два итератора задающих диапазон элементов для сортировки
comp объект функции сравнения (т.е. объект, удовлетворяющий требованиям Compare), который возвращает true, если первый аргумент "меньше", чем второй.

Определение сравнения должно быть эквивалентно:

bool cmp(const Type1 &a, const Type2 &b);

Использование noexcept(начиная с C++11) желательно но не обязательно. Параметры не обязаны передаваться по const&, но не должны модифицироваться. Они должны быть способны принимать все значения типа (даже const) Type1 и Type2 независимо от категории значений (таким образом, Type1& не допускается, равно как и Type1, если только для Type1 перемещение не эквивалентно копированию(начиная с C++11)). Типы Type1 и Type2 должны быть таковы, что объект типа RandomIt может быть разыменован и затем неявно преобразован в оба из них.

Требования к типам
-
RandomIt должен соответствовать требованиям ValueSwappable и RandomAccessIterator.
-
The type of dereferenced RandomIt must meet the requirements of MoveAssignable and MoveConstructible.

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

(Нет)

[править]Предусловия

[править]Постусловия

1,2)[[assume(std::is_sorted(first,last))]]
3,4)[[assume(std::is_sorted(first,last,comp))]]

[править]Исключения

Перегрузки с параметром шаблона по имени ExecutionPolicy сообщают об ошибках следующим образом:

  • Если выполнение функции, вызванной как часть алгоритма, вызывает исключение и ExecutionPolicy является одной из стандартных политик, вызывается std::terminate. Для любой другой ExecutionPolicy поведение определяется реализацией.
  • Если алгоритму не удаётся выделить память, генерируется std::bad_alloc.

[править]Сложность

O(N·log(N)), где N =std::distance(first, last) применения cmp.

[править]Заметки

До LWG713, сложность std::sort() зависела от реализации Quicksort, гарантировалось лишь O(N2
)
сравнений в худшем случае.

Introsort имеет сложность O(N·log(N)) сравнений (without incurring additional overhead in the average case), и, теперь обычно используется для реализации sort().

в libc++
не было реализовано исправленное требование временной сложности
Оригинал:
has not implemented the corrected time complexity requirement
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
until LLVM 14.

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

См. также реализацию в libstdc++ и libc++.

#include <algorithm>#include <functional>#include <array>#include <iostream>#include <iterator>    int main(){std::array<int, 10> s{5, 7, 4, 2, 8, 6, 1, 9, 0, 3};   std::sort(s.begin(), s.end());std::copy(s.begin(), s.end(), std::ostream_iterator<int>(std::cout," "));std::cout<<std::endl;   std::sort(s.begin(), s.end(), std::greater<int>());std::copy(s.begin(), s.end(), std::ostream_iterator<int>(std::cout," "));std::cout<<std::endl;}

Вывод:

0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0

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

сортирует первые N элементов диапазона
(шаблон функции)[править]
сортирует диапазон элементов, сохраняя порядок между равными элементами
(шаблон функции)[править]
сортирует диапазон в порядке возрастания
(ниблоид)[править]
close