算法分析基本概念
本章介紹一些簡單的算法,特別是與搜索和排序相關的那一類;其次講述用於算法設計和分析的基本概念。
順序搜索
// LinearSearch
//輸入:n個元素的數組A[1...n]和元素x。
//輸出:如果 x = A[j],1<= j <=n 則輸出j,否則輸出0.
j = 1
while(j < n)and(x != A[j])
j = j+1
end while
if x = A[j] then return j
else return 0
二分搜索
// BinarySearch
//輸入:n個元素的升序數組A[1...n]和元素x。
//輸出:如果 x = A[j],1<= j <=n 則輸出j,否則輸出0.
low = 1 ; high = n ; j = 0 ;
while(low <= high)and(j = 0)
mid = (low + high)/2
if x = A[mid] then j = mid
else if x < A[mid] then high = mid - 1
else low = mid + 1
end while
return j
合併兩個已排序的表
// Merge
//輸入:數組A[1...m]和它的三個索引 p,q,r,1<=p<=q<r<=m,
//兩個子數組 A[p..q] 和 A[q+1...r]各自按升序排列
//輸出:合併兩個子數組 A[p...q] 和 A[q+1...r]的數組 A[p...r]
comment : B[p...r]是個輔助數組
s = p ; t = q + 1 ; k = p
while s <= q and t <= r
if A[s] <= A[t] then
B[k] = A[s]
s = s + 1
else
B[k] = A[t]
t = t + 1
end if
k = k + 1
end while
if s = q + 1 then B[k...r] = A[t...r]
else B[k...r] = A[s...q]
A[p...r] = B[p...r]
選擇排序
// SelectionSort
//輸入:n個元素的數組A[1...n]
//輸出:按非降序排列的數組 A[1...n]
for i = 1 to n-1
k = i
for j = i+1 to n
if A[j] < A[k] then k = j
end for
if k != i then A[i] <-> A[k]
end for
插入排序
// InsertionSort
//輸入:n個元素的數組A[1...n]
//輸出:按非降序排列的數組 A[1...n]
for i = 2 to n
x = A[i]
j = i - 1
while(j > 0)and(A[j] > x)
A[j+1] = A[j]
j = j - 1
end while
A[j+1] = x
end for
自底向上合併排序
// BottomupSort
//輸入:n個元素的數組A[1...n]
//輸出:按非降序排列的數組 A[1...n]
t = 1
while t < n
s = t; t = 2s ; i = 0
while i + t <= n
Merge(A, i+1, i+s, i+t)
i = i + t
end while
if i + s < n Merge(A, i+1, i+s, n)
end while
時間複雜性
- 階的增長
元運算: 對任何計算步驟,它的代價總是以一個時間常量爲上界,而不管數據輸入或執行的算法,我們稱該步驟爲 “ 元運算 ” 。
算數運算,包括加、減、乘和除。
比較和邏輯運算。
賦值運算,包括遍歷表或樹的指針賦值。
- 符號
- 符號
- 符號
-
舉例
-
複雜性類與 o 符號
空間複雜性
不包括用來存儲輸入的空間 , S(n) = O( T(n) )