该证明是归纳证明,其内容如下:
P(n)是“快速排序对长度为n的每个输入数组正确排序”的断言。
基本情况:每个长度为1的输入数组都已排序(P(1)成立)
归纳步骤:修复n => 2.修复一些长度为n的输入数组。
需要说明:如果对于所有k <n,P(k)成立,那么P(n)也成立
然后,他绘制围绕某个枢轴p划分的数组A。因此,他绘制了p,并将数组<p的部分称为第一部分,将> p的部分称为第二部分。部分1的长度= k1,部分2的长度为k2。通过“分区”子程序的正确性证明(之前已证明),枢轴p缠绕在正确的位置。
通过归纳假设:第1,第2部分通过递归调用正确排序。(使用P(K1),P(k2))
所以:在递归调用之后,整个数组都将正确排序。
QED
我的困惑:我很难确切地看到这如何证明它的正确性。因此,我们假设P(k)确实适用于所有自然数k <n。
到目前为止,我看到的大多数归纳证明都类似:证明基本情况,并证明P(n)=> P(n + 1)。他们通常还涉及某种代数运算。这个证明似乎有很大的不同,我不理解如何将归纳概念应用到它。我可以合理地推断出Partition子例程的正确性是关键。因此,其正确性的理由如下:我们知道,每个递归调用都会围绕枢轴对数组进行分区。然后,该支点将处于其应有的位置。然后,每个子数组将进一步围绕枢轴进行划分,然后该枢轴将处于其正确位置。这样一直进行下去,直到得到长度为1的子数组,该数组被简单地排序了。
但是然后我们不假设P(k)满足所有k <n...。实际上我们正在展示它(因为Partition子例程将始终将一个元素置于其合法位置。)我们不是假设P (k)持有所有k