Важно отметить, что алгоритм, который является O(N log N)
, не всегда быстрее на практике, чем алгоритм O(N^2)
.Это зависит от констант и диапазона N
.(Помните, что асимптотическая запись измеряет относительную скорость роста, а не абсолютную скорость).
Для малых N
сортировка вставки фактически превосходит сортировку слиянием.Это также быстрее для почти отсортированных массивов.
Вот цитата :
Хотя это один из элементарных алгоритмов сортировки с O(N^2)
в худшем случаевремя сортировки вставкой является предпочтительным алгоритмом, когда данные почти отсортированы (потому что они адаптивные) или когда размер проблемы небольшой (потому что у него низкие накладные расходы).
По этим причинам и потому, что онтакже стабильна, сортировка вставки часто используется в качестве рекурсивного базового случая (когда размер проблемы мал) для алгоритмов сортировки с большим разделением и завоеванием, таких как сортировка слиянием или быстрая сортировка.
Вот еще одна цитата из Лучший алгоритм сортировки для почти отсортированных списков paper:
прямая сортировка с вставкой лучше всего подходит для небольших или почти отсортированных списков
Это означает, что на практике:
- Какой-то алгоритм A 1 с более высокой асимптотической верхней границей может быть предпочтительнее, чем другой узелwn алгоритм A 2 с нижней асимптотической верхней границей
- Возможно A 2 слишком сложен для реализации
- Или, возможно, это не имеет значения в диапазоне
N
, считаемом
- Некоторые гибридные алгоритмы могут адаптировать разные алгоритмы в зависимости от размера ввода
Смежные вопросы
Числовой пример
Давайте рассмотрим эти две функции:
f(x) = 2x^2
;эта функция имеет квадратичную скорость роста, то есть "O(N^2)
" g(x) = 10x
;эта функция имеет линейную скорость роста, то есть "O(N)
"
Теперь давайте построим две функции вместе:
Источник: WolframAlpha: plot 2x^2 and 10x for x from 0 to 10
Обратите внимание, что между x=0..5
, f(x) <= g(x)
, но для любых больших x
, f(x)
быстро перерастает g(x)
.
Аналогично, если A 1 является квадратичным алгоритмом с низкими издержками, а A 2 являетсялинейный алгоритм с высокими издержками для меньшего ввода A 1 может быть быстрее, чем A 2 .
Таким образом, вы можете, если захотите, создать гибридный алгоритм A 3 , который просто выбирает один из двух алгоритмов в зависимости от размера входных данных.Стоит ли это усилий или нет, зависит от фактических параметров.
Было проведено много тестов и сравнений алгоритмов сортировки, и было решено, что поскольку сортировка вставками превосходит сортировку слиянием для небольших массивов, это стоило тогоэто реализовать как для Arrays.sort
.