《算法导论》第三版第2章 算法基础 练习&思考题 个人答案

这篇博客详细解答了《算法导论》第三版第2章的练习题目,涉及插入排序、线性查找、二分查找、归并排序等多种算法的分析、设计和效率讨论。博主对每个问题提供了思路和解决方案,并通过伪代码展示算法执行过程,深入浅出地阐述了排序和查找算法的基本思想及其优化方法。
摘要由CSDN通过智能技术生成

2.1 插入排序

2.1-1 以图2-2为模型,说明INSERTION-SORT在数组A=<31, 41, 59, 26, 41, 58>上的执行过程。

思路:仔细研究插入排序代码即可,无需思路,注意A中先后存在两个41,在排序过程中及排序后这两个41的先后顺序仍然不变,即插入排序具有稳定性(概念见第8章)。
解:<31, 41, 59, 26, 41, 58>→<26, 31, 41, 59, 41, 58>→<26, 31, 41, 41, 59, 58>→<26, 31, 41, 41, 58, 59>

2.1-2 重写过程INSERTION-SORT,使之按非升序(而不是非降序)排序。

思路:此处将原代码第5行的A[i]>key的大于号改为小于号即可。
解:

INSERTION-SORT(A)
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

2.1-3 考虑以下查找问题
输入n个数的一个序列A=<a1, a2, … , an>和一个值v
输出:下标i使得v=A[i]或者当v不在A中出现时,v为特殊值NIL。
写出线性查找的伪代码,它扫描整个序列来查找v。使用一个循环不变式来证明你的算法是正确的。确保你的循环不变式满足三条必要的性质。

思路:顺序遍历数组即可。
解:

LINEAR-SEARCH(A, v)
flag = 0
if A.length == 0
    return NIL
for j = 1 to A.length
    if A[j] == v
	flag = 1
	return j
if flag == 0
    return NIL

证明略。

2.1-4 考虑把两个n位二进制整数加起来的问题,这两个整数分别存储在两个n元数组A和B中。这两个整数的和应按二进制形式存储在一个(n+1)元数组C中。请给出该问题的形式化描述,并写出伪代码。

解:
(1)形式化描述:
输入:n个bool值的两个序列A=<a1, a2, … , an>,B=<b1, b2, … , bn>。
输出:(n+1)个bool值的一个序列C=<c1, c2, … , cn>。
(2)
思路:在每一位上,0+0=0,0+1=1+0=1,1+1=0并向前进位,因此C每一位的值等于A异或B并加上低一位的进位。
伪代码:

<
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值