title: 算法分析与设计 date: 2019-01-01 10:17:01 tags: 算法
第一章
- 最大公约数算法:
- gcd(m, n) = gcd(n, m mod n)
- 结束条件是 m%n = 0
第二章
- 算法时间效率度量 —— 基本操作的执行次数。
- 渐进符号(可以按照复杂程度记忆,最简单的为上界,最复杂的为下界)
- 斐波那契数列
- 参数 α,β 可以通过 F(1)、F(2)联立方程组解出来
第三章
- 选择排序
- 冒泡排序
- 幻方
第四章
- 分治法
- 合并排序
- 快速排序
c++ #include<iostream> using namespace std; int a[5], n; void quickSort(int left, int right){ if (left >= right) return; int i, j, t, temp; i = left; j = right; temp = a[left]; while (true){ while (a[j] >= temp && i < j){ j--; } while (a[i] <= temp && i < j){ i++; } if (i < j){ t = a[i]; a[i] = a[j]; a[j] = t; } else break; } a[left] = a[j]; a[j] = temp; quickSort(left, i - 1); quickSort(i + 1, right); } int main() { for (int i = 1; i <= 5; i++){ cin >> a[i]; } quickSort(1, n); for (int i = 1; i <= 5; i++){ cout << a[i] << " "; } cout << endl; return 0; }
- 大整数乘法
- Strassen 矩阵乘法
第五章
- 减治算法
第六章
- 平衡二叉树
这里的 LR 旋转是相对的概念, 意思是先变成左子树再向右旋转。
- 2-3 树
2-3 树是一种特殊的高度平衡树,允许结点最多包含两个关键字。 ❑ 2-node:包含一个关键字,两个子节点 ❑ 3-node:包含两个关键字,三个子节点
- Horner 法则
第七章
- 计数排序
- 分布计数排序
实现代码:
```c++ #include using namespace std; int a[10], l, u, D[10], S[10];
void DistributeSort(){
for (int i = 0; i <= u - l; i++){
D[i] = 0;
}
for (int i = 0; i < 10; i++){
D[a[i] - l]++;
}
for (int i = 1; i <= u - l; i++){
D[i] += D[i - 1];
}
for (int i = 9; i >= 0; i--){
int j = a[i] - l;
S[D[j] - 1] = a[i];
D[j] -= 1;
}
for (int i = 0; i < 10; i++){
cout << S[i] << " ";
}
}
int main()
{
l = 1, u = 3;
for (int i = 0; i < 10; i++){
cin >> a[i]; // 1 2 3 1 2 3 1 2 3 1
}
DistributeSort();
return 0;
}
```