冒泡排序算法(伪代码):
Input: Array A[1...n]
for i <- n,...,2 do
for j <- 2,...,i do
if A[j - 1] >= A[j] then
swap the values of A[j-1] and A[j];
我不确定,但我的证明似乎有用,但过于混乱。你能帮我清理吗?
循环不变式:每次迭代i之后,i-n + 1最大 A的元素处于将被排序的位置 非降序地。如果数组A包含多个 最大值,让最大的元素成为索引最小的元素 所有可能的最大值。
归纳法(i = n):内部循环遍历的每个元素 A.最终,j指向最大元素。该值将是 交换直到到达位置i = n,这是最高位置 在数组A中,因此是A中最大元素的最终位置。
归纳步骤:(对于所有m> 3,i = m-> i = m-1):内部循环 迭代A的每个元素。最终,j指向最大的 尚未排序的元素。该值将交换直到 它到达位置i = m-1,这是位置的最高位置 数组A中尚未排序的位置,因此的最终位置 A中尚未分类的最大元素。
算法完全执行后,其余元素位于 位置1也处于最终位置,因为不是 右侧的元素将不在其最终位置,即 矛盾。 Q.E.D。
答案 0 :(得分:1)
我倾向于以以下方式重铸您的证明:
Bubble sort A[1..n]:
for i in n..2
for j in 2..i
swap A[j - 1], A[j] if they are not already in order
循环不变式:
令P(i)<=>对于所有k s.t. i 基本情况:
最初,i = n,并且满足不变量P(n)。 归纳步骤:
假设对于某些P(m + 1)成立,
表明在执行内循环之后,不变量保持P(m)。