[算法学习笔记]算法基础知识

算法基础知识

算法的五大要素

  1. 有穷性:算法必须能够在有限个步骤内完成。
  2. 确定性:算法的每一步必须有确定的定义。
  3. 输入
  4. 输出
  5. 可行性:算法的每个步骤都必须能分解为基本的可执行操作,每个步骤都必须能在有限时间内完成

循环不变式

循环中的循环不变式可以帮助我们理解算法的正确性。为了证明算法的正确,必须证明循环不变式的三个性质:
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应该插入的位置。

结合看两个循环,则可以看出整个算法是正确的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值