稳定排序:排序前后两个相等的数相对位置不变,则算法稳定。
非稳定排序:排序前后两个相等的数相对位置发生了变化,则算法不稳定。
时间复杂度计算方法:
用常数1代替运行时间中的所有加法常数 修改后的运行次数函数中,只保留最高阶 去除最高阶项的系数。
这个与耗时并无直接联系。时间复杂度的计算并不是计算程序具体运行的时间,而是算法执行语句的次数。简而言之,就是计算机执行一个算法快慢的量度体现。
常见的时间复杂度:
常数阶O(1)
对数阶O(log2n)
线性阶O(n)
线性对数阶O(nlog2n)
平方阶O(n2)
立方阶O(n3)
k次方阶O(nk)
指数阶O(2n)
随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
O(1) < O(log ₂n) <O (n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
时间复杂度为:O(1):
时间复杂度用来表示代码执行时间的增长变化趋势的。上面的算法并没有随着变量的增长而增长耗费时间,那么无论这类代码有多长,都可以用O(1)来表示它的时间复杂度。
private int getSum(int a) {
int sum = 0;
sum=sum+a;
return sum;
}
时间复杂度为:O(n):
这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用O(n)来表示它的时间复杂度。但是如果arr[i]等于1的话,则循环执行一次判断跳出,时间复杂度是O(1)。
int i=0; while (i < n && arr[i]!=1){ i++; }
时间复杂度为:O(log ₂n)
从上面代码可以看到,在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。我们试着求解一下,假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2^n
也就是说当循环 log2^n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(logn)
也就是说当循环 log2^n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(logn)
for(m=1; m<n; m++){ i = 1; while(i<n) { i = i * 2; } }
时间复杂度为:O(n²)
如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²) 了。O(n³)相当于三层n循环,其它的类似还有K次方阶O(n^k)。
空间复杂度:
算法所占用的存储空间主要包括:
输入数据所占空间只取决于问题本身,和算法无关。我们所说的空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,即第三项。通常来说,只要算法不涉及到动态分配的空间以及递归、栈所需的空间,空间复杂度通常为0(1)。
1、
程序本身所占用的空间2、
输入输出变量所占用的空间3、
动态分配的临时空间,通常指辅助变量输入数据所占空间只取决于问题本身,和算法无关。我们所说的空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,即第三项。通常来说,只要算法不涉及到动态分配的空间以及递归、栈所需的空间,空间复杂度通常为0(1)。