算法导论学习笔记(二)

笔记

插入排序:
输入:a1,a2,a3,a4…an
输出:a1’,a2’,a3’,a4’…an’,满足(a1’<=a2’<=a3’<=a4’…an’)
对于少量元素是一个有效的算法

//insertion-sort伪代码(插入A[j]进入到A[1]~A[j-1]的序列中)
for 2 to A.length
	key=A[j]
	i=j-1
	while i>0 and A[i]>key
		A[i+1]=A[i]
		i=i-1
	A[i+1]=key

循环不变式和插入排序的正确性
插入排序:
循环不变式主要用来辅助我们理解算法的正确性,对于循环不变式,必须证明它的三个性质:

  • 初始化:它在循环的第一轮迭代开始之前,应该是正确的。
  • 保持:如果在某一次循环迭代开始之前是正确的,那么在下一次迭代开始之前,它也应该保持正确。
  • 结束:当循环结束时,不变式给了我们一个有用的性质,它有助于表明算法是正确的。

插入排序的正确性:

  • 初始化:在第一轮迭代开始之前,证明其正确性。此时j=2,A[1…j-1]中只有一个元素A[1],显然,一个元素是已经排序的了。所以,证明了循环不变式在第一轮迭代之前是成立的。
  • 保持:接下来要证明在每轮迭代中,循环不变式保持成立。迭代之前,假设A[1…j-1]是已经排好序的序列,待排序的元素A[j]依次与A[j-1]、A[j-2]进行比较,如果A[j-1]等大于A[j],则依次将其向右移动一位A[i+1]<—A[i],当遇到开始小于A[j]的元素时,则A[j]找到了合适的插入位置,插入之后,整个序列又是排好序的了。即在假设j成立的情况下,j+1也成立,循环不变式在迭代过程中保持成立。
  • 终止:最后,分析一下循环结束时候的情况。当j=n+1时,循环结束,此时A[1…n]中已经有n个元素,且已经排好序,就是排好序的数组A[1…n],所以算法正确。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值