算法
排序
- 冒泡(双重循环)外层是趟数,内层是比较的位置,然后两两交换
- 选择排序(双重循环)外层是趟数,内层找到当前趟数的最大值放到最后面
- 插入排序 一个数插入有序数组,从第一个数开始比较
- 快速排序 每趟找一个数,比它小的放前面,比它大的放后面,不断减小范围
- 归并排序 将两个有序数组合并成一个有序数组
- 堆排序 建立一个堆的过程
- 希尔排序 数组分隔成n组,然后插入排序
- 桶排序
哈夫曼树
- 定义:带权路径长度最小的数
- 每次取权值最小的两个结点生成树,新的父节点为两结点之和
A*算法
- 寻路时维护open list和close list,每次从open list中找F值最小的那个
- F=G+H=移动到当前位置的代价+估计出的当前位置到终点的代价
并查集
- 实际上是一棵树,初始每个结点的父亲是自己
- 只有并和查两种操作,查就是递归的查找自己的父结点,直到一个结点的父结点是自己;并就是把一个结点的父亲换成另一个结点
- 路径压缩:先找到根结点,再把根节点以下的所有结点的父亲设置成根节点
KMP
- next数组 if(j==-1)或匹配 j=next[i-1]+1 else j=next[i]
- 不匹配时根据next数组滑动
最小生成树
- 加点法 最小的边对应的点,放入集合中,直到有n-1条边或n个顶点
- 加边法 最小的边加入边集,保证这个边在两棵树上
最短路径
- 弗洛伊德(动态规划思想)
- 迪杰斯特拉 定义起点sv,定义点集S-已经求到最短路径的点,U-还未求到最短路径的点;从U中找到最短的路径加入S
拓扑排序
每次选择入度为0的点,即为拓扑排序