《演算法導論》2 1練習答案

2021-10-16 12:27:46 字數 1740 閱讀 2815

2.1-1應該不用寫了

2.1-2重寫過程inertion-sort,使之按公升序排序

偽**實現:

inertion-sort(a)

for j=2 to a.length

key=a[j]

//insert a[j] to the sorted sequence a[1..j-1]

i=j-1

while i>0 and a[i]附贈c語言實現:

#include

void

insertsort

(int a,

int n)

a[j +1]

= key;}}

main()

;insertsort

(a,6);

for(

int i =

0; i <

6; i++

)printf

("%d "

,a[i]);

}

2.1-3考慮以下查詢問題:

輸入:n個數的乙個序列a=1,a2,…,an>和乙個值v。

輸出:下標i使得v=a[i]或者當v不在a**現時,v為特殊值nil。

寫出線性查詢的偽**,它掃瞄整個序列來查詢v,使用乙個迴圈不變式來證明你的演算法是正確的。確保你的迴圈不變式滿足三條必要的性質。

偽**:

linear-search(a,v)

for i=1 to a.length

if a[i]==v

return i

return nil

迴圈不變式:在for迴圈的每次迭代開始時,子陣列a[1…i-1]不包含等於v的元素。

2.1-4考慮把兩個n位二進位制整數加起來的問題,這兩個整數分別儲存在兩個n元陣列a和b中。這兩個整數的和按二進位制形式儲存在乙個(n+1)元陣列c中。請給出該問題的形式化描述,並寫出偽**。

偽**:

binary-sum(a,b)

c=new integer[a.length+1]

carry=0

for i=a.length-1 to 0

c[i+1]=(a[i]+b[i]+carry)%2

carry=(a[i]+b[i]+carry)/2

c[0]=carry

return c

附贈c語言實現:

//使用陣列對兩個n位二進位制整數進行二進位制加法

#include

#include

int*

binarysum

(int

* a,

int* b,

int n)

c[0]

= carry;

return c;

}main()

;int b=

;int

* c =

binarysum

(a, b,6)

;for

(int i =

0; i <

7; i++

)printf

("%d"

, c[i]);

//輸出1000001

free

(c);

}

演算法導論 練習2 1

2.1 1 2.1 2 python 重寫insertion sort python 下列表從0 開始 def insertion sort a for j in range 1,len a key a j i j 1 while i 0 and a i 迴圈不變式的證明 初始化 起始時未對陣列a中...

《演算法導論》2 2練習答案

捨棄它的低階項,並忽略前面的常數因子 n3 2.2 2考慮排序儲存在陣列a中的n個數 首先找出a中的最小元素並將其與a 1 中的元素進行交換。接著,找出a中的次最小元素並將其與a 2 中的元素進行交換。對a中前n 1個元素按該方式繼續。該演算法稱為選擇演算法,寫出其偽 該演算法維持的迴圈不變式是什麼...

演算法導論2 3練習答案

使用哨兵的歸併排序 merge sort 見文章 c語言實現歸併排序 無哨兵版 include include include include void merge int a,int p,int q,int r r中的元素複製完畢,只需繼續複製l中的 else if j n2 從l r陣列中取更小...