算法笔记
一、排序算法
1.桶排序(最快最简单的排序)
这个算法就好比有11个桶,编号从0~10。每出现一个数,就将对应编号的桶中的放一个小旗子,最后只要数数每个桶中有几个小旗子就OK了。
优点:速度快
缺点:比较费空间
时间复杂度:O(M+N)
2.冒泡排序:(邻居好说话,但是效率低)
就如同是一个气泡,一步一步往后“翻滚”,直到最后一位。
优点:空间复杂度较小
缺点:时间复杂度较高(因此不推荐)
时间复杂度:O(N^2)
3.快速排序:(最常用的排序)
每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。
优点:比冒泡排序效率要高
缺点:最差的情况,复杂度等于冒泡排序
时间复杂度:O(NlogN)
二、常用数据结构
1.队列:先进先出
2.栈:后进先出
3.链表:快速插入
双向链表、循环链表
三、常用算法
1.枚举法:暴力破解
通过优化算法,可以减少计算量,降低时间复杂度
2.搜索算法:递归+枚举
1)深度优先搜索算法:先深入,再退回,再广度
水管问题
2)广度优先搜索算法:先广度,再排除,再深入
漫水填充法
3.图算法:利用特制的线条算图求得答案的一种简便算法。无向图、有向图和网络能运用很多常用的图算法,这些算法包括:各种遍历算法(这些遍历类似于树的遍历),寻找最短路径的算法,寻找网络中最低代价路径的算法,回答一些简单相关问题(例如,图是否是连通的,图中两个顶点间的最短路径是什么,等等)的算法。图算法可应用到多种场合,例如:优化管道、路由表、快递服务、通信网站等。
1)floyd-warshall算法:只需5行代码。使用穷举法,遍历所有2点间的距离,是否比它们之间加入其它点中转要短
2)dijkstra算法:
附录:
时间复杂度:
我们用大写字母 O来表示时间复杂度,因此如果算法的时间复杂度是 O(m+n+m+n)即 O(2*(m+n))。我们在说时间复杂度的时候可以忽略较小 的常数,最终桶排序的时间复杂度为 O(m+n)。还有一点,在表示时间复杂度的时候,n 和 m 通常用大写字母即 O(M+N)。