Функция sort и алгоритмы сортировки [закрыт]

201
03 июля 2018, 13:00

Скорее всего, все наслышаны про различные алгоритмы сортировок. Также, в C++ есть встроенная библиотека <algorithm>, в которой есть функция sort. Использовать ли её, и будет ли это быстрее, чем алгоритмы сортировок?

Answer 1

std::sort реализует один из алгоритмов сортировки (а иначе как отсортировать, если не использовать алгоритм сортировки).

Поэтому, правильно вопрос должен звучать где то так - алгоритм сортировки в std::sort хорош или нет? И ответ будет такой - в общем случае алгоритм std::sort достаточно хорош. Он обесчечивает n*ln(n) сложность.

Но очень часто нам известны некоторые характеристики сортируемого массива. И в этом случае самопальные алгоритмы могут оказаться сильно-сильно быстрее. К примеру, если массив уже почти отсортирован (всего 1-2 элемента не на своем месте) - в этом случае хорошо отработает обычный пузырек. Или массив состоит из однобайтовых чисел. В этом случае хорошо отработает сортировка подсчетом (за ленейное время).

И ещё один момент - сортировки бывают устойчивые и нет. Устойчивые сортировки сохранят относительный порядок одинаковых элементов. Если сортировать числа, то разницы нет, а вот если сложные объекты, то это может быть очень важно. std::sort реализует неустойчивую сортировку. А для устойчивой можно использовать stable_sort.

И последний момент - разные сортировки используют разный объем памяти. Пузырьку нужно всего два счетчика и одна переменная для обмена (но часто можно и без нее). А некоторым сортировкам нужны двукратные запасы. И если массив достаточно большой, то "быстрая сортировка" может быть не такой быстрой (память не безгранична, а своп - медленный). А пузырек потихоньку может и обогнать.

Answer 2

Библиотека C++ содержит целый ряд альгоритмов сортировки:

is_sorted  (C++11) 

проверяет, является ли диапазон отсортированым в порядке возрастания

is_sorted_until  (C++11) 

находит наибольший из отсортированых поддиапазонов

sort

сортирует диапазон в порядке возрастания

partial_sort 

сортирует первые N элементов в диапазоне

partial_sort_copy 

копирует и частично сортирует диапазон элементов

stable_sort 

сортирует диапазон элементов при сохранении порядка между равными элементами

nth_element 

помещает n-й элемент в позицию, которую он занимал бы после сортировки всего диапазона

В зависимости от задачи используйте один из этих альгоритмов. Все они работают максимально быстро, если правильно выбрать. Хотя могут быть случаи, когда простой альгоритм, написанным для конкретного тривиального случая, может оказаться быстрее...

READ ALSO
Jni интерфейсы java

Jni интерфейсы java

Из сторонней библиотеки необходимо вызывать методы в C++

201
Заполнение матрицы

Заполнение матрицы

У нас есть матрица а*bНужно заполнить её нулями с помощью встроеной функции

177
Полоса анимации при загрузке страницы

Полоса анимации при загрузке страницы

На сайте https://wwwsofiapapadopoulou

192