证明合并排序输出输入的排列

时间:2019-10-30 20:01:35

标签: algorithm sorting mergesort divide-and-conquer correctness

我开始研究计算逻辑,作为练习,我想证明合并排序算法的正确性。

目前,我很难证明该算法的输出将始终与给定输入的排列相对应。

如果有人可以帮助我,我将感到非常高兴。

非常感谢?

2 个答案:

答案 0 :(得分:1)

该证明的核心将需要显示“合并”过程将每个元素插入一次,并且仅将一次插入到结果中。由于合并过程使用循环进行,因此您需要使用loop invariant来显示此内容。

通常可以通过询问“循环的一半是什么?”来发现循环不变式。

to merge arrays A and B:
    let n = length of A, m = length of B
    let R = new array of length (n + m)
    let i = 0, j = 0
    while i < n or j < m:
        if i < n and (j == m or A[i] <= B[j]):
            R[i+j] = A[i]
            i = i + 1
        else:
            R[i+j] = B[j]
            j = j + 1
    return R

在此循环中,我们始终知道R的前i + j个元素是A的前i个元素和B的前j个元素的某些排列。这是循环不变式,因此您需要证明: / p>

  1. 这是在循环开始之前(当i = j = 0时)。
  2. 如果在循环迭代之前为真,则在迭代之后仍为真,即保留不变式。
  3. 如果在循环终止时(i = m,j = n)为真,则数组R具有必需的属性。

通常,这样的证明的难点在于发现循环不变式,并表明循环的每次迭代都保留了不变式。

答案 1 :(得分:0)

合并排序的先决条件是什么?职位条件是什么?你有循环不变式吗?

这是开始编写证明之前必须问自己的三个问题。

然后:您的基本情况是什么?大概您知道如果处理证明时合并排序是如何工作的,那么当您将长度为1的数组传递给mergesort函数时会发生什么呢?那里的后置条件是什么?

这里是decent primer from Berkeley,用于证明函数的正确性。编写证明可能需要一些离散的数学(归纳法)。