排序
时间复杂度
问题
面试时被问到冒泡
排序
,选择
排序
和快速
排序
的
时间复杂度
问题,由于自己基础不扎实,当场懵逼,这件事一直让我反思了好几天。
可能你会正确地写出这几种
排序
,可能你会背过别人给你说的
时间复杂度
。我也是这样。
先说冒泡
排序
:
冒泡
排序
不管序列是怎样,都是要比较n(n-1)/2 次的,O(N2),
而对于交换次数来说,如果是数组是有序的则,只不需要交换。如果数组是逆序的则需要交换n(
O(1):常数复杂度 Constant Complexity
O(log n):对数复杂度 Logarithmic Complexity
O(n): 线性
时间复杂度
Linear Complexity
O(n^2): N平方 N square Complexity
O(n^3): N立方 N cubic Complexity
O(2^n):指
(1)在比较类
排序
中,归并
排序
号称最快,其次是快速
排序
和堆
排序
,两者不相伯仲,但是有一点需要注意,数据初始
排序
状态对堆
排序
不会产生太大的影响,而快速
排序
却恰恰相反。
(2)线性时间非比较类
排序
一般要优于非.
挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),
分割:重新
排序
数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的
排序
就已经完成,
递归
排序
子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列
排序
。
递归到最底部的判断条件是
算法(algorithm) 是指用来操作数据和解决问题的一组方法。对于同一个问题,使用不同的算法,结果一眼但是过程种消耗的资源与时间是不同的,衡量一个算法的优劣常常从时间和空间两个维度思考。分析方法是大O复杂度分析法。
时间维度:算法执行所消耗的时间,即
时间复杂度
空间维度:算法执行所消耗的内存,即空间复杂度
一、大O
时间复杂度
分析法
1> 概念:并不表示代码真正执行花费的时间,而是表示...
bool visited[MaxVertexNum];
int vex_num;//全局变量,用来统计一轮深度遍历访问的顶点个数
int arc_num;//全局变量,用来统计一轮深度遍历访问的边数
void DFSTraverse
一个无向图是树的条件是有n-1条边的连通图
顶点个数和边的信息在结构体G中含有,剩下的就是判断图是否联通
通过dfs如果能访问到所有节点那么这个图就是连通的,这里又计算了一个e其实是多余的
const int MAXN = 1000;
int vis[MAXN];
void dfs(Graph *G, int v, int &n, int &e)
vis[v] = 1;
n++; // 来到一个从来未访问过的节点, 计数器加一