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陣列中取更小...