《算法导论》第三版 2.1 插入排序

INSERTION-SORT(A)

for j = 2 to A.length
    key = A[j]
    //Insert A[j] into the sorted sequence A[i...j-1]
    i = j - 1
    while i > 0 and A[i] > key
        A[i+1] = A[i]
        i = i - 1
    A[i+1] = key

对数组A进行从小到大插入排序
从数组的第二位开始(这本书的伪代码数组下标从1开始),将其赋值给key依次与在它前面的元素进行比较,直到i=0或者遇到比它的数停下,开始比较后一位

while i > 0 and A[i] > key
    A[i+1] = A[i]
    i = i - 1

上述代码的作用是将比key大的数依次往后挪一位,使A[j]可以放到在它前面所有比它大的数的前面。


下面的都是我自己写的不是标准答案!!!


1.说明INSERTION-SORT 在数组 A = <31,41,59,26,41,58>上的执行过程

<31,41,59,26,41,58> 从第二位(j=2)(也就是左边的41)往前比较,没有比它大的不移动位置
<31,41,59,26,41,58>到第三位(59),也没有比它大的,不移动位置
<26,31,41,59,41,58>第四位(26),前面全部都比它大,移到最前面
<26,31,41,41,59,58>到第五位(右边41),移动到59前面
<26,31,41,41,58,59>第六位,移动到59前面
结束

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

插入排序顺序的关键就是
while i > 0 and A[i] >key
只要将它改为<就可以让它变成非升序,其他部分不变

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

fun(A,v)

for i = 1 to A.length
    if A[i] == v
        return i
return NIL

循环不变式:A[1…j]代表的是查找过的元素子数组
初始化:循环第一次迭代之前它为真
保持:如果循环的某次迭代之前它为真,那么下次迭代之前它也为真
终止:在循环终止时

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

求二进制A+B的和,存放进C中

a=b=c=1
while a<n||b<n
    if A[a]==1&&B[b]==1
        k=c+1
    else if A[a]==1||B[b]==1
        k=c
    while C[k]==1
        C[k]=0
        k=k+1
    C[k]=1
    a=b=c=c+1
return C

猜你喜欢

转载自blog.csdn.net/qq_15718805/article/details/80368565