1.插入排序
有数组A[n] = {5,2,4,6,1,3}
给出下标 j = 2 to n,表示正被插入到手中的’当前牌’。
每次抽一次牌就进行一次由已排序数列的最大数向最小数的查找,查找过程用 i 作为当前被用于比较的牌的下标,对数列中的数依次查找。
如果A[i] > A[j],则A[i+1] = A[i],A[i] = A[j],即将当前两个下标所指向的数交换位置,再将下标i向左退一位,实现数字在数组上的右移。
直到循环结束,完成这一张牌的插入。
已排序队列 A[1…j-1] 具有循环不变式的性质。
2.循环不变式
三条需要证明的性质
初始化:循环的第一次迭代之前,不变式为真
保持:每次迭代保持循环不变式的正确性
终止:循环终止时,不变式提供一个可证明算法正确的性质
证明
初始化:
循环前,A[1…j-1]只有一个元素A[1],显然是已排序状态,所以为真。
保持:
每一次for循环过程中,A[1…j-1]都已被排序,而当A[j]上的数被插入到正确的位置后,A[1…j]也被排序,所以为真。
终止:
首先,终止是必然出现且成立的,因为循环终止条件是j > A.length = n,且j每次自增1,必然会出现j = n+1的情况。
再者,子数组