演算法導論 練習2 3

2021-10-22 14:27:03 字數 3052 閱讀 9539

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...