呵呵,代码你已经看懂了,只是不明白为什么可以这样做是吧。
这需要做一点简单的数学论证。
证明并不复杂,但也不是一两句话能说清楚的。举个例子吧。
假设要合并4堆。每堆为a1, a2, a3, a4(下标从1开始)已经按递增序列排好。
那么合并顺序为
a4 + a3 = s1
s1 + a2 = a4 + a3 + a2 = s2
s2 + a1 = a4 + a3 + a2 + a1 = s3
合并结果为
s1 + s2 + s3 =
a4 + a3 +
a4 + a3 + a2 +
a4 + a3 + a2 + a1
=
a1 * 1 + a2 * 2 + a3 * 3 + a4 * 4 - a4
最大值的计算就是基于以上的推论。
最小值也是基于类似的推论。这里都要分析极值与每次合并数及合并次数的关系。
有兴趣的话我可以展开证明一下(不过这里大多数人对证明没什么兴趣)。