合并两个小序列 - 算法

时间:2015-02-12 20:54:31

标签: merge proof array-algorithms

证明最多进行5次比较就足以合并两个长度为2和5的排序序列。

1 个答案:

答案 0 :(得分:1)

假设输入数组为[a b c d e][x y]

我们首先尝试将x插入较大的数组中。我们进行二分搜索,但我们抓住机会:我们不是从中间开始,而是从左到右:我们检查x < b

  • 如果我们幸运 x落在数组的左侧(较小)部分,我们可以比较x < a以确定是否结果应以x aa x开头。然后我们对y进行3次比较,这足以进行二分搜索。

  • 如果我们不幸 x落在数组的右侧(较大)部分。换句话说,x应该在c d e中。我们通过检查x < d继续二进制搜索。

    • 如果我们幸运这是错误的,因为我们知道结果以a b c d开头,然后我们可以检查x < e和{ {1}}弄清楚最后三个元素的顺序。

    • 如果是这样,我们会检查y < e以确定序列应该以{{1​​}}还是x < c开头。然后我们进行了2次比较,这足以对a b c x进行二分搜索,因为我们知道它应该在a b x的右侧。

这当然只是一个解决方案的大纲,而不是一个正式的证明。但是,它可以使用Hoare逻辑轻松转换为正式证明。它看起来如下:

y