Алгоритм std::sort
(и его кузены std::partial_sort
и std::nth_element
) из стандартной библиотеки С++ находится в большинстве реализаций сложное и гибридное объединение более элементарных алгоритмов сортировки, такие как сортировка выбора, сортировка вставки, быстрая сортировка, сортировка слияния или сортировка кучи.
Здесь много вопросов и на таких сайтах, как https://codereview.stackexchange.com/, связанных с ошибками, сложностью и другими аспектами реализации этих классических алгоритмов сортировки. Большинство предлагаемых реализаций состоят из необработанных циклов, используют манипуляции с индексами и конкретные типы и, как правило, нетривиальны для анализа с точки зрения правильности и эффективности.
Вопрос: как можно реализовать вышеупомянутые классические алгоритмы сортировки с использованием современного С++?
- нет сырых циклов, но объединение стандартных алгоритмических блоков стандартной библиотеки из
<algorithm>
- интерфейс итератора и использование шаблонов вместо манипуляции индексами и конкретных типов
- стиль С++ 14, включая полную стандартную библиотеку, а также синтаксические шумоподавители, такие как
auto
, псевдонимы шаблонов, прозрачные компараторы и полиморфные лямбды.
Примечания:
- для дальнейших ссылок на реализации алгоритмов сортировки см. Wikipedia, Rosetta Code или http://www.sorting-algorithms.com/
- согласно Соглашения Sean Parent (слайд 39), необработанный цикл - это
for
-loop дольше чем состав двух функций с оператором. Таким образом,f(g(x));
илиf(x); g(x);
илиf(x) + g(x);
не являются необработанными циклами, а также не являются петлями вselection_sort
иinsertion_sort
ниже. - Я следую терминологии Scott Meyers, чтобы обозначить текущий С++ 1y уже как С++ 14 и обозначить С++ 98 и С++ 03 как С++ 98, поэтому не плачьте меня за это.
- Как было предложено в комментариях @Mehrdad, в конце ответа я предоставляю четыре реализации в виде Живого примера: С++ 14, С++ 11, С++ 98 и Boost и С++ 98.
- Сам ответ представлен только в С++ 14. Там, где это уместно, я обозначаю различия в синтаксисе и библиотеке, где разные версии языка отличаются.