算法导论练习 2.1 Insertion sort

  1. {31, 41, 59, 26, 41, 58}
    {31, 41, 59, 26, 41, 58}
    {31, 41, 59, 26, 41, 58}
    {26, 31, 41, 59, 41, 58}
    {26, 31, 41, 41, 59, 58}
    {26, 31, 41, 41, 58, 59}

for j = 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
  1. 伪码:
for i = 1 to A.length
	if v == A[i]
		return i
return NIL

证明正确性:
先证明循环的正确性,循环不变式为:在 for 循环的每次迭代开始的时候,子数组 A[1 … i - 1] 中不包含元素 v。

  • Initialization:初始的时候 i - 1 等于 0,所以子数组不存在,自然不包含元素 v
  • Maintenance:每次迭代开始前,子数组 A[1 … i - 1] 中不包含元素 v,如果 A[i] 的值等于 v,就会退出循环,所以迭代结束时 子数组 A[1 … i] 中不包含元素 v,下次迭代开始前 i 会自增,从而循环不变量保持不变。
  • Termination:有两种可能导致循环结束:或者是找到了 v,或者是因为 i == A.length + 1。如果是前者,那么就达到了搜索的目的;如果是后者,那么说明数组 A[1…A.length],即整个数组中都没有 v,返回 NIL,依然是正确的。
  1. 正式表述问题:输入两个长度为 n 的数组 A 和数组 B(下标从 1 到 n),数组中的元素是 0 或 1,数组 A 和数组 B 分别表示一个二进制数(下标 1 的元素表示最低位)。要求返回长度为 n+1 的数组 C,以同样的格式表示一个二进制数,且其大小等于 A 与 B 之和。
    伪码:
int C[n + 1] = {0}, carry = 0
for i = 1 to n
	C[i] = (A[i] + B[i] + carry) % 2
	carry = (A[i] + B[i] + carry) / 2
C[n + 1] = carry
return C
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值