当对两个长度为 L1 和 L2 的列表进行合并排序时,我认为最坏情况的比较次数是 L1+L2-1。
- 最初您有五个 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 实现。基于此,对于 1..5 的排列,比较次数为 5、6、7 或 8。
-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].