第二章 2.1插入排序

2.1-1 以图2-2为模型,说明INSERTION-SORT在数组A={31,41,59,26,41,58}上的执行过程。
31
31 41
31 41 59
26 31 41 59
26 31 41 58 59
2.1-2重写过程INSERTION-SORT,使之按非升序(而不是非降序)排序。

INSERTION-Sort
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。使用一个循环不变式来证明你的算法是正确的。确保你的循环不变式满足三条必要的性质。

循环不变式主要用来帮助我们理解算法的正确性。关于循环不变式,我们必须证明三条性质:
初始化:循环的第一次迭代之前,它为真。
保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍为真。
终止:在循环终止时,不变式为我们提供一个有用的性质,该性质有助于证明算法是正确的。

    for(int i=0;i<A.length;i++)
    {
        if(A[i]==v)
        {
            return i;
        }
        else
        {
            v=NIL;
            return null;
        }
}

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

flag=0;
for(int i==0;i<n;i++)
{
    if(A[i]==1&&B[i]==1)
    {
        C[i]=flag;
        flag=1;
    }
    else if(A[i]==0&&B[i]==0)
    {
        C[i]=flag;
        flag=0;
    }
    else
    {
        if(flag)
        {
            C[i]=0
            flag=1
        }
        else
        {
            C[i]=1
            flag=0
        }
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值