При сортировке слиянием двух списков длины L1 и L2, я предполагаю, что худшее число сравнений - L1 + L2-1.
- Изначально у вас есть пять длинных списков.
- Вы можете объединить две пары списков с 2 сравнениями , что приведет к спискам длиной 2,2 и 1.
- Затем вы можете объединить 2 и 1 длинный список с не более чем 1 + 2-1 = 2 сравнениями , получив 2 и 3 длинный список.
- Наконец, вы объединяете эти списки с максимум 2 + 3-1 = 4 сравнениями .
Так что я думаю, что ответ 8.
Эта последовательность чисел приводит к приведенному выше:
[2], [4], [1], [3], [5] -> [2,4], [1,3], [5] -> [2,4], [1,3,5 ] -> [1,2,3,4,5]
Изменить:
Вот наивная реализация Erlang. Исходя из этого, количество сравнений составляет 5,6,7 или 8 для перестановок 1,5.
-module(mergesort).
-compile(export_all).
test() ->
lists:sort([{sort(L),L} || L <- permutations()]).
sort([]) -> {0, []};
sort([_] = L) -> {0, L};
sort(L) ->
{L1, L2} = lists:split(length(L) div 2, L),
{C1, SL1} = sort(L1), {C2, SL2} = sort(L2),
{C3, RL} = merge(SL1, SL2, [], 0),
{C1+C2+C3, RL}.
merge([], L2, Merged, Comps) -> {Comps, Merged ++ L2};
merge(L1, [], Merged, Comps) -> {Comps, Merged ++ L1};
merge([H1|T1], [H2|_] = L2, Merged, Comps) when H1 < H2 -> merge(T1, L2, Merged ++[H1], Comps + 1);
merge(L1, [H2|T2], Merged, Comps) -> merge(L1, T2, Merged ++[H2], Comps + 1).
permutations() ->
L = lists:seq(1,5),
[[A,B,C,D,E] || A <- L, B <- L, C <- L, D <- L, E <- L, A =/= B, A =/= C, A =/= D, A =/= E, B =/= C, B =/= D, B =/= E, C =/= D, C =/= E, D =/= E].