2.3-1
[3] [41] [52] [26] [38] [57] [9] [49]
[3|41] [26|52] [38|57] [9|49]
[3|26|41|52] [9|38|49|57]
[3|9|26|38|41|49|52|57]
2.3-2
def
meger
(a,p,q,r)
:'''
:param a:原陣列
:param l: 左陣列
:param r: 右陣列
:return:
'''d=
#臨時陣列
在最壞的情況下把a[n] 插入到已排序的a[1,2,…,n-1] 中需要θ(n)的時間,因此遞迴式為(這裡面打公式好複雜啊):
用遞迴的方式實現插入排序:
# 用遞迴實現插入排序 這樣也算是完成了吧
definset
(a,m)
:# 把m插入到已經排好序的a中
key=
1for i in
range
(len
(a))
:if a[i]
>m :
a.insert(i,m)
key=
0break
if key:
definsrt_sort
(a,n)
:if n-
1<0:
return
insrt_sort(a,n-1)
inset(d, a[n-1]
)if __name__==
'__main__'
: a=[9
,8,7
,6,5
,4,3
,2,1
] d=
k=len
(a) insrt_sort(a,k)
print
(d)
2.3-5
二分查詢:
def
recursive_binary_search
(a, v, low, high)
:# 一層層的返回,直到最上面那層
if low > high or low==
len(a)
:return
none
mid =
int(
(low + high)/2
)# print(mid)
if v == a[mid]
:return mid
elif v > a[mid]
:return recursive_binary_search(a, v, mid +
1, high)
else
:return recursive_binary_search(a, v, low, mid -1)
if __name__ ==
'__main__'
: a=[1
,2,3
,4,5
,6,7
,8,9
] r=
len(a)
k=1 res=recursive_binary_search(a,4,
0,9)
print
(res)
每次v與中間元素比較時,搜尋減少一半,遞迴式為:
複雜度為θ(lg(n))
2.3-6
每次執行到while迴圈的5-7行時,反向掃瞄已經排好序的a[1..j-1],該迴圈不僅僅是為了把a[j]放到合適的位置,
同時它把每個大於a[j]的元素向右移動了一次(第六行),在最壞情況下複雜度是θ(j), 即所有j-1個在a[j]前的
元素都比a[j]大。用二分查詢尋找a[j]的位置的時間複雜度為θ(lg(j)),比移動元素的複雜度要小,因此該迴圈的
時間複雜度仍舊由移動元素的複雜度θ(j)決定。
所以,加入二分查詢後,插入排序的時間複雜度並不會改善。
2.3-7
1、對s進行排序,時間複雜度最快為θ(nlg(n))
2、對s中的每乙個元素si,i=1,2....n,在s[i+1,..n]中二分查詢元素key=x-si,二分查詢θ(lg(n));
如果key存在,返回其與si的下標
否則,繼續迴圈
最多迴圈n次,複雜度為n*θ(lgn)
總共的時間複雜度為:θ(nlg(n)) + n*θ(lg(n))=θ(nlg(n))
演算法導論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陣列中取更小...
演算法導論 練習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
2.2 1 只看最高次項,並忽略係數,時間複雜度為 n 3 2.2 2 def swap a,b return b,a defselect sort a n len a for i in range n 1 minindex i for j in range i 1 n if a j mininde...