void Func2(int N)
{
int count = 0;
for (int k = 0;k<2*N;++k)
{
++count ;
}
int M = 10;
while(M--)
{
++count;
}
printf("%d\n",count);
}
基本操作执行了2N+10次,通过推导大O阶方法,时间复杂度O(N)
void Func3(int N, int M) {
int count = 0;
for (int k = 0; k < M; ++ k)
{
++count;
}
for (int k = 0; k < N ; ++ k)
{
++count;
}
printf("%d\n", count);
}
执行了M+N次,有两个未知数M和N,O(N+M)
void Func4(int N) {
int count = 0;
for (int k = 0; k < 100; ++ k)
{
++count;
}
printf("%d\n", count);
}
执行10次 O(N+M)
const char * strchr ( const char * str, int character );
最好执行1次,最坏执行N次,时间复杂度看最坏,为O(N)
void Bubblesort (int*a , int n)
{
assert(a);
for(size_t end = n;end>0--end)
{
int exchange = 0;
for(size_t i = 1;i<end;++i)
{
if(a[i-1]>a[i])
{
Swao(&a[i-1],&a[i])
exchange = 1;
}
}
if(exchange == 0)
break;
}
}
实例
5
基本操作执行最好
N
次,最坏执行了
(N*(N+1)/2
次,通过推导大
O
阶方法
+
时间复杂度一般看最坏,时间复杂度为 O(N^2)
int BinarySearch(int* n ,int n ,int x)
{
assert(a);
int begin = 0;
int end = n;
while(begin<end)
{
int mid = begin + ((end - begin)>>1);
if(a[mid]<x)
begin = mid + 1;
else if(a[mid]>x)
end = mid;
else
return mid;
}
return -1;
}
最好情况O(1)
最坏情况O(log2N)
long long Fac(size_t N)
{
if(0==N)
return 1;
return Fac(N-1)*N;
}
O(N),递归操作了N次
long long Fac(size_t N)
{
if(0==N)
return 1;
for (size_t i = 0;i<N;++i)
{
printf("%d",i);
}
printf("\n");
return Fac(N-1)*N;
}
O(N*N)
递归算法的时间复杂度计算
1.每次函数调用是O(1),就看其递归次数
2.每次函数调用不是O(1),那么就看其递归调用中次数的累加、
long long Fib(size_t,N)//斐波那契数列
{
if(N<3)
return 1;
reuturn Fib(N-1)+Fib(N-2);
}
形成二叉树结构的递归调用
最后一层 2^(n-1) 累加且忽略得O(2^N)
int missingNumber(int* nums, int numsSize){
int sum = 0;
for(int i = 0;i<numsSize+1;i++)
{
sum +=i;
}
for(int i = 0;i<numsSize;i++)
{
sum-=nums[i];
}
return sum;
}
异或法:相同为0,相异为1,无关顺序,设置x=0,与数组数字异或
int missingNumber(int* nums, int numsSize){
int x = 0;
for(int i = 0;i<numsSize;++i)
{
x^=nums[i];
}
for(int i = 0;i<=numsSize;++i)
{
x^=i;
}
return x;
}