演算法導論 - 演算法入門 ,一小節(插入排序,複雜度)
#插入排序 - 複雜度
definsertion_sort(arr): #1
forj
inxrange(
1,len(arr) ):
#n-1
key
=arr[j]
#n-1i=
j-1#
n-1while
i>=
0 and
arr[i]
>
key :
#n(n-1)/2
arr[i+1
] =arr[i]
#n(n-1)/2i=
i-1#
n(n-1)/2
arr[i+1
] =key
#n-1
arr
#n-1
驗證結果 :
>>> arr=[5,2,4,6,1,3]
>>> insertion_sort(arr)
[2, 5, 4, 6, 1, 3]
[2, 4, 5, 6, 1, 3]
[2, 4, 5, 6, 1, 3]
[1, 2, 4, 5, 6, 3]
[1, 2, 3, 4, 5, 6]
驗證複雜度:
z = 5(n-1)+1+3n(n-1)/2
我們測試資料 為 n=6
當資料極端情況就是需要全部重新排列
就是 [6,5,4,3,2,1] 要排出 [1,2,3,4,5,6] 這樣
>> z = 71
一種比較笨的 驗證方法 供大家拍磚 :
definsertion_sort(arr): ii=
0ii+=1
forj
inxrange(
1,len(arr) ):
ii+=
1key
=arr[j]
ii+=1i
=j-1
ii+=
1while
i>=
0 and
arr[i]
>
key :
ii+=
1arr[i+1
] =arr[i]
ii+=1i
=i-1
ii+=
1arr[i+1
] =key
ii+=
1print
arr
ii+=
1print
"----
",str(ii)
>>> arr=[6,5,4,3,2,1]
>>> insertion_sort(arr)
[5, 6, 4, 3, 2, 1]
[4, 5, 6, 3, 2, 1]
[3, 4, 5, 6, 2, 1]
[2, 3, 4, 5, 6, 1]
[1, 2, 3, 4, 5, 6]
---- 71 #複雜度驗證為 71
羅嗦下 n(n-1)/2
極端情況下
i=1 ; j 需要挪動 1次
i=2 ; j 挪動 1+2次
i=3 ; j 挪動 1+2+3次
....
i=n ; j 挪動 1+2....+n
我們又找到 (1+n)+(2+n-1)+(3+n-2).... = (1+n)n/2
我們這 的 i 是從 2 次開始的 也就是說 (n-1)n/2 了
deftn(ii):ti=
0for
i in
xrange(ii) :
forj
inxrange(i) :
ti+=
1print
tiprint
tn(2
) #
1 = 1
tn(3
) #
3 = 1+2
tn(4
) #
6 = 1+2+3..
跟我一起學 演算法導論 堆
encoding utf 8 遞迴 單條路 自下往上排序 defheap adjust data,s,m if2 s m return 宣告 預設父節點位置 temp s 1 左 子節點值 大於 父節點值 預設父節點位置 為 左子節點位置 ifdata 2 s 1 data temp temp 2 ...
跟我一起學 演算法導論 分治演算法
演算法導論,一章二小節 分治演算法 defmerge a,p,q,r print s s s s p,q 1 q 1,r 1 if p q l a p 10 10 else l a p q 1 10 10 if q 1 r r a r 10 10 else r a q 1 r 1 10 10 i j...
跟我一起學 演算法導論 函式的增長
3.1 漸近號 漸近範圍 f n g n a b 漸近上界 f n g n a b 0 f n cg n 漸近下界 f n g n a b 0 cg n f n 非漸近上界 f n o g n alim n f n g n 0 非漸近下界 f n g n a b 0 cg n lim n f n g...