#c_sharp #net #сортировка
Array.Sort() в C# использует алгоритм разумной сортировки (introsort) следующим образом:
Если размер раздела меньше 16 элементов, он использует insertion sort алгоритм.
Если количество секций превышает 2 * log(N), где N диапазон входного массива, он
использует Heapsort алгоритм.
В противном случае он использует Quicksort алгоритм.
У меня такой вопрос: как этот алгоритм высчитывает количество секций в массиве? Было
бы глупо предположить, что встроенная сортировка сначала высчитывает на сколько секций
квиксорт разделит этот массив, а потом уже выбирает алгоритм.
Может быть есть какая-то формула?
Ответы
Ответ 1
Я думаю, что понятие "количество секций в массиве" здесь появилось вследствие какого-то недоразумения - возможно, кривой перевод. Интросорт использует быструю сортировку, которая выполняет разделение массива (partition) на части по выбранному опорному элементу (pivot). Вот если массив особо гнусный и опоры выбираются неудачно, то этих самых разделений будет слишком много. Интросорт следит за этим (глубина), и переключается на сортировку кучей. Для идеального случая глубина log2(n). Каков критерий глубины для переключения - зависит от конкретной реализации. Вот пример: The GNU Standard C++ library is similar: uses introsort with a maximum depth of 2×log2 n И опять мы видим использование кривого перевода - log это логарифм, а не журнал
Комментариев нет:
Отправить комментарий