Чем ближе входной список к уже отсортированной, тем меньше время выполнения (это потому, что процедуре merge
не нужно move
любое из значений, если все уже в правильном порядке; выполняет O ( n ) сравнений.Так как MergeSort рекурсивно вызывает себя на каждой половине разбиения, нужно выбрать функцию split
, которая увеличивает вероятность того, что результирующие половины список в отсортированном порядке. Если список в основном отсортирован, то разделение по четному-нечетному будет лучше, чем разделение по середине. Например,
MergeSort([2, 1, 4, 3, 5, 7])
приведет к
Merge(MergeSort([2, 1, 4]), MergeSort([3, 5, 7]))
если мы разделим середину (обратите внимание, что в обоих подсписках есть ошибки сортировки), тогда как если бы мы делали четно-нечетное разделение, мы получили бы
Merge(MergeSort([2, 4, 5]), MergeSort([1, 3, 7]))
, что приводит к двум уже отсортированным спискам (и лучшая производительность для последующих вызовов MergeSort
). Однако, ничего не зная о списках ввода, выбор функции разделения не должен влиять на время выполнения асимптотически.