Подтвердить что ты не робот

Проверяет std:: sort, если вектор уже отсортирован?

Я считаю, что стандарт С++ для std::sort не гарантирует производительность O (n) в уже отсортированном списке. Но тем не менее, мне интересно, насколько вам известно, какие реализации STL (GCC, MSVC и т.д.) Делают проверку std::is_sorted перед выполнением алгоритм сортировки?

С другой стороны, какую производительность можно ожидать (без гарантий, конечно) от запуска std::sort в сортированном контейнере?

Боковое примечание: я опубликовал некоторые ориентиры для GCC 4.5 с включенным С++ 0x в моем блоге. Здесь результаты:

Comparison of std::sort and std::is_sorted

4b9b3361

Ответ 1

Реализации могут использовать любой эффективный алгоритм сортировки, который они хотят, поэтому он сильно зависит от реализации

Однако я видел сравнение производительности libstdС++, используемое в Linux, и против libС++ - новую библиотеку С++, разработанную Apple/LLVM. Обе эти библиотеки очень эффективны при сортировке или обратном сортировке данных (гораздо быстрее, чем в случайном списке), когда новая библиотека значительно быстрее, чем старая, и распознает еще много шаблонов.

Чтобы быть уверенным, что вам следует подумать о своих собственных тестах.

Ответ 2

Нет. Кроме того, нелогично иметь is_sorted() для любой реализации STL. Поскольку is_sorted() доступен уже как автономный. И многие пользователи могут не захотеть тратить циклы выполнения без необходимости вызывать эту функцию, когда они уже знают, что их контейнер не отсортирован.

STL также должен следовать философии С++: " оплата за использование".

Ответ 3

Ничего себе! Были ли у вас оптимизация полностью сработала?

Here's результаты вашего кода на моей платформе (обратите внимание на значения на вертикальной оси).

Ответ 4

Я предлагаю вам прочитать это сравнение алгоритмов сортировки, это очень хорошо сделано и информативно, оно сравнивает ряд алгоритмов сортировки друг с другом и с реализацией GCC std:: sort. В диаграммах на данной ссылке вы заметите, что производительность std:: sort для "почти отсортированных" и "почти обратных" линейных по количеству сортируемых элементов, то есть O (n). Таким образом, никаких гарантий нет, но вы можете легко ожидать, что отсортированный список будет отсортирован почти в течение линейного времени. Но, конечно, он не выполняет проверку is_sorted, и даже если он будет сортировать отсортированный массив в линейном времени, это будет не так быстро, как выполнить проверку is_sorted и вообще пропустить сортировку. Это ваше решение определить, лучше ли проверять перед сортировкой или нет.

Ответ 5

Стандартные санкции только std::sort реализации со сложностью O (n log n):

Сложность: Приблизительно N log N (где N == last - first) сравнения в среднем.

См. раздел 25.3.1.1 Сортировка [lib.sort] (ISO/IEC 14882: 2003 (E)).

Таким образом, набор разрешенных функций сортировки ограничен, и вы правы, что это не гарантирует линейную сложность.

Идеальное поведение для сортировки - это O (n), но это невозможно в среднем случае.

Конечно, средний случай - это не обязательно точный случай, который у вас есть прямо сейчас, поэтому для случаев с короткими гарантиями не так много.

Ответ 6

И почему любая реализация делает эту проверку? Что бы это выиграло? - Ничего в среднем. Хорошим правилом проектирования является не замедление реализации с оптимизацией для угловых случаев, которые не имеют никакого значения в среднем. Этот пример аналогичен проверке на самоопределение. Простой ответ: не делайте этого.

Ответ 7

Там нет гарантии, что он это проверит. Некоторые реализации будут делать это, другие, вероятно, не будут.

Однако, если вы подозреваете, что ваш вход уже может быть отсортирован (или почти отсортирован), std::stable_sort может быть лучшим вариантом.