Какой алгоритм сортировки используется методом .NET Array.Sort()?

Какой алгоритм сортировки используется методом .NET Array.Sort()?

Ответ 1

Он использует алгоритм QuickSort.

Источник:

Ответ 2

Array.Sort() выбирает один из трех алгоритмов сортировки, в зависимости от размера ввода:

  • Если размер меньше 16 элементов, он использует алгоритм сортировки вставки.
  • Если размер превышает 2 * log^N, где N - это диапазон входного массива, он использует алгоритм сортировки кучи.
  • В противном случае он использует алгоритм Quicksort

Источник: Метод Array.Sort(Array) в MSDN.

Ответ 3

Собственно, это не так просто, как кажется. Похоже,.NET реализует множество различных алгоритмов сортировки в зависимости от ввода и его размера. Раньше я декомпилировал Array.Sort() из CLR, и кажется, что они используют как кучу, вставку, так и Quicksort. enter image description here

Ответ 4

Быстрая сортировка, как упоминалось. Но это не одинаково хорошо для всех данных!

Используя рефлектор: он сортирует в родной dll → для наиболее распространенного случая 1D массивов в порядке возрастания. Однако другие случаи сортируются в управляемом коде - с очень небольшими оптимизациями. Следовательно, их скорость обычно намного медленнее.

Ответ 5

Еще несколько заметок из MSDN

Этот метод использует интроспективный алгоритм сортировки (introsort) как следующим образом:

Если размер раздела меньше 16 элементов, используется вставка алгоритм сортировки.

Если число разделов превышает 2 * LogN, где N - это диапазон входной массив, он использует алгоритм Heapsort.

Otherwise, it uses a Quicksort algorithm.

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

Для массивов, отсортированных с использованием Heapsort и Quicksort алгоритмы, в худшем случае, этот метод является O (n log n), где n - длина.

Примечания для абонентов .NET Framework 4 и более ранние версии используются только алгоритм быстрой сортировки. Быстрая сортировка выявляет недопустимые компараторы в некоторые ситуации, в которых операция сортировки Исключение IndexOutOfRangeException и создает исключение ArgumentException исключение для звонящего. Начиная с .NET Framework 4.5, это возможно, что операции сортировки, которые ранее бросили ArgumentException не сгенерирует исключение, потому что вставка Алгоритмы sort и heapsort не обнаруживают недопустимый компаратор. За по большей части это относится к массивам с менее чем 16 элементами.