标签:算法
循环中的循环不变式可以帮助我们理解算法的正确性。为了证明算法的正确,必须证明循环不变式的三个性质:
1. 初始化:循环不变式在循环开始之前是正确的。
2. 保持:循环不变式在循环的每一次迭代开始之前是正确的。
3. 终止:在循环结束时,不变式会给出一个可以对判断算法是否正确有帮助的性质。
下面是插入排序的一个简单的c++实现
void insert_sort(std::vector<int>& vec) {
for (int i = 1; i < vec.size(); i++) {
int key = vec[i];
//将vec[i]插入到已经排好序的vec[0...i-1]中
int j = i;
while(j > 0) {
if(key >= vec[j - 1])break;
vec[j] = vec[j - 1];
--j;
}
vec[j] = key;
}
}
这里有两个循环不变式,一个是外层循环的 i < vec.size(),我们可以来证明循环不变式的三个性质:
1. 初始化 :在第一次迭代开始之前,i = 1,由于vec不少于1个元素(不然就不用排序了),显然成立。
2. 保持:在循环结束之前,i显然也是小于vec.size()的。
3. 终止:当将所有的元素排好序之后,i = vec.size() - 1,进行i++之后,循环终止,表明已经排好序了。
第二个循环则是内层的while循环。我们同样可以证明循环不变式的三个性质:
1. 初始化:在刚开始的时候,i = j = 1,所以,j > 0 显然成立,如果key < vec[j-1],则进入循环。不变式j > 0 && key < vec[j-1]成立。
2. 保持:在找到key应该插入的位置之前,如果未到vec首位(j = 0)的话,则key < vec[j-1]必须成立。
3. 终止:循环结束之后,循环不变式不再成立,j指向的正好是key应该插入的位置。
结合看两个循环,则可以看出整个算法是正确的。
标签:算法
原文地址:http://blog.csdn.net/dx2880/article/details/43939491