例1:
for(int i = 1;i<=n;i*=2)
{
for(int j = 1;j<=n;j++)
p--;
}
时间复杂度:O(n*log2n)
内层循环改为 <=i
时间复杂度:O(n2) 1+2+3...+n 等差数列前n项和
例二:
for(i = 1;i<=n;i++)
for(j = 1;j<=i;j++)
for(k = 1;k<=j;k++)
p--;
时间复杂度:O(n3)
计算过程:
1+(1+2)+(1+2+3)+(1+2+3+...)+...+..(1+2+3+...+n)
i(i+1)/2 i从1到n 求和 n(n+1)(2n+1)/6 ???
递归的时间复杂度计算:递归的通式:T(n) = aT(n/b)+f(n) n为数据规模
例3:T(n) = 3T(n/4)+cn2
时间复杂度:O(n2)
例4:T(n) = 2T(n/2)+1
时间复杂度:O(n)
简便算法:直接算O(nlogba ) 和 f(n) 将这连个数比较 , 取结果大的一个
上面两个一样大的时候 结果为 O(nlogba * log2n)
名称 最好时间复杂度 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性
冒泡 O(n)正序 O(n^2) O(n^2)逆序 O(1) 稳定
简单选择 O(n^2) O(n^2) O(n^2) O(1) 不稳定
插入排序 O(n)正序 O(n^2) O(n^2)逆序 O(1) 稳定
快排 O(n*log2 n) O(n*log2 n) O(n^2)有序/逆序最坏 O(log2 n) 不稳定
希尔(插入) O(n)正序 O(n的(1.2~1.5)) O(n^2)逆序 O(1) 不稳定
归并(二路) O(n*log2 n) O(n*log2 n) O(n*log2 n) O(n) 稳定
堆排(选择) O(n*log2 n) O(n*log2 n) O(n*log2 n) O(1) 不稳定
基数排序 O(d*(n+r)) O(d*(n+r)) O(d*(n+r)) O(n+r) 稳定
注:
空间复杂度 额外申请的空间 包括变量和动态申请的
常量空间复杂度:如果我们额外申请的空间 不随着处理数据量的增大而增大 那么我们称这样的空间复杂度为常量空间复杂度记为O(1)
稳定:数值相等的两个元素 在排序前后其相对位置未发生改变
基数排序最稳定 d------位数 r--------桶的个数
别的排序可能受人的写法影响稳定性
归并排序 -----空间复杂度 如果申请了额外数组就是O(n) 没申请就是O(log2 n)
堆排
建立初始堆------ S = 2^(k-2)*1+2^(k-3)*2+...+1*(k-1) 错位相减 ----------------- O(n)
排序------------- O(n*log2 n)