算法分析基本概念
本章介绍一些简单的算法,特别是与搜索和排序相关的那一类;其次讲述用于算法设计和分析的基本概念。
顺序搜索
// 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) )