Какой тип сортировки используется в std :: sort ()?

Может кто-нибудь, пожалуйста, скажите мне, какой метод сортировки (пузырь, вставка, выбор, быстрый, слияние, счет …) реализуется в функции std::sort() определенной в заголовочном файле ?

Большинство реализаций std::sort используют quicksort (или обычно гибридный алгоритм, такой как introsort, который объединяет сортировку quicksort, heapsort и insertion).

Единственное, что требуется стандарту, это то, что std::sort каким- std::sort образом сортирует данные в соответствии с указанным порядком со сложностью приблизительно O (N log (N)); не гарантируется стабильность. Технически, introsort лучше отвечает требованиям сложности, чем quicksort, потому что quicksort имеет квадратичное худшее время.

Стандарт C ++ ISO / IEC 14882: 2003

25.3.1.1 сортировать

 template void sort(RandomAccessIterator first, RandomAccessIterator last); template void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 

1 Эффекты : Сортирует элементы в диапазоне [первый, последний].

2 Сложность : Приблизительно N log N (где N == последний – первый) сравнений в среднем.

Информация о методе отсутствует, но сложность всегда равна N log N

Существует три алгоритма, которые используются в STL MSVC2013, ссылаясь на исходный код std::sort .

Скорее всего, он использует QuickSort или вариант с IntroSort называемый IntroSort .

Если recursion идет слишком глубоко, HeapSort будет использоваться HeapSort .

В противном случае будет использоваться InsertSort .

Вероятно, все реализации std::sort используют introsort (aka introspection sort ), гибридный алгоритм, который объединяет quicksort и heapsort. Фактически, интросорт был особенно изобретен в 1997 году с целью реализации исполнительского сорта в C ++ STL.

Единственное, что требуется стандарту, это то, что std::sort каким- std::sort образом сортирует данные в соответствии с указанным порядком со сложностью O (N log (N)) ; он не гарантированно стабилен (имеется отдельный алгоритм std::stable_sort , если это потребуется).

Технически, introsort лучше отвечает требованиям сложности, чем quicksort: это потому, что heapsort гарантировал сложность O (N log (N)) в худшем случае, тогда как quicksort имеет квадратичное худшее время.

Тем не менее, heapsort «медленнее», чем quicksort в среднем случае, в том смысле, что heapsort выполняет C * N log (N), тогда как quicksort имеет производительность D * N log (n) , при этом D значительно меньше C (числа C и D – константы). Другими словами, накладные расходы по сравнению с предыдущим объемом выше, чем у быстрой сортировки.

Чтобы получить лучшее из обоих миров, introsort начинается с quicksort-рекурсивного алгоритма, но когда глубина рекурсии становится слишком высокой (что означает, что она попадает в вырожденное худшее поведение), она переключается на heapsort.

См. Также запись в Википедии для интросорта или оригинальной статьи Дэвида Муссера, который изобрел интросорт, особенно для STL.

Вы имеете в виду std :: sort? Если так, то это может быть реализовано любым способом. Вероятно, это Quick sort, но может быть radix или что-то еще. Пока он производит вам отсортированный список, по крайней мере, в O (n log n), реализация в порядке, afaik.

Только некоторые эмпирические результаты:

Я перевел скрипт python с использованием метода numpy 1.9.2 в C ++, используя std :: sort (VS2008 toolchain).

Я получаю только точные результаты в python и C ++, когда я использую аргумент numpy.sort kind = ‘mergesort’. Я получаю разные относительные упорядочения для элементов с одним ключом, когда kind = ‘quicksort’ или kind = ‘heapsort’. Поэтому я предполагаю, что по крайней мере для версии STL, которая поставляется с VS2008, std :: sort использует mergesort.

  • Закажите «смешанный» вектор (цифры с буквами)
  • Сортировка Java на основе констант Enum
  • Сортировка поля varchar численно в MySQL
  • Как реализовать автоматическую сортировку DataGridView?
  • Почему мой цикл сортировки, кажется, добавляет элемент, где он не должен?
  • Какой лучший способ сортировать по 5-звездочному рейтингу?
  • Сортировка списка с адаптером массива
  • Алгоритм разделения элементов того же типа
  • Сортировка вектора пользовательских объектов
  • Как использовать Collections.sort () в Java? (Конкретная ситуация)
  • Как использовать std :: sort для сортировки массива в C ++
  • Interesting Posts

    переопределить css для проверки формы html5 / требуемого всплывающего windows

    Переключение между Java 7 и 8 в OS X

    Чтение целого числа из пользовательского ввода

    Изменение положения диалогового windows на экране Android

    Почему подключенный раздел NTFS не отображается в файловом менеджере Linux?

    В чем преимущество шаблона без логики (например, усы)?

    Заполните непересекающиеся пустые ячейки со значением из ячейки над первым пробелом

    Как получить список установленных приложений для Android и выбрать один для запуска

    Деление плавающей запятой в пакетном файле

    Поместите пятно в системный лоток вместо панели задач

    Как сохранить вывод строки в результате, возвращаемом командой bash

    Есть ли простой способ преобразования данных MySQL в Title Case?

    Возьмите сумму переменной, если комбинация значений в двух других столбцах уникальна

    Как отслеживать изменения содержимого буфера обмена в C #?

    Android: добавление статического заголовка в начало ListActivity

    Давайте будем гением компьютера.