第一部分 基础知识
第2章 算法基础
1. 插入排序
- 对于少量元素的排序,它是一个有效的算法
- 从右向左进行比较
- 原址排序(常数个数字存储在数组外面)
- 复杂度 O(n²)
Insertion-sort(A)
for j = 2 to A.length
key = A[j]
// Insert A[j] into the second sequence A[1..j-1].
i = j - 1;
while i > 0 and A[i] > key
A[i+1] = A[i]
i = i - 1
A[i+1] = key
2. 分析算法
- 一般来说,算法需要的时间与输入的规模同步增长,所以通常把一个程序的运行时间描述成其输入规模的函数
3. 分治法
思想
将原问题分解为几个规模但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。
步骤
- 分解
- 解决
- 合并(关键操作)
归并排序
复杂度 O(nlgn)
A是一个数组,p、q和r是数组下载,满足 p≤q<r;∞是哨兵牌
Merge(A, p, q, r)
n1 = q - p + 1
n2 = r - q
let L[1..n1+1] and R[1..n2+1] be new arrays
for i = 1 to n1
L[i] = A[p+i-1]
for j = 1 to n2
R[j] = A[q+j]
L[n1+1] = ∞
R[n2+1] = ∞
i = 1
j = 1
for k = p to r
if L[i] ≤ R[j]
A[k] = L[i]
i = i + 1
else
A[k] = R[j]
j = j + 1
Merge-sort(A, p, r)
if p < r
q = ⌊(p + r) / 2⌋
Merge-sort(A, p, q)
Merge-sort(A, q+1, r)
Merge(A, p, q, r)