问题 求任意n个整数的和?
int Sum(int a[],int n)
{
int sum = 0;//O(1)
for(int i = 0;i < n;i++)// O(n)
sum += a[i];
return sum; //O(1)
}
时间 T(n) = 1 + n * 1 + 1 = n + 2 = O(n)
空间 除了输入空间以外的 O(2) 为 O(1)
减而治之 分而治之
sum (int a[],int n)
{
return (n < 1) ? 0 : sum(a,n-1) + a[n-1];
}
T(n) = O(n)
二分递归
sum(int A[],int lo,int hi)
{
if(lo == hi)return A[lo];
int mi = (lo + hi) >> 1;
return sum(A,lo,mi) + sum(A,mi + 1,hi);
}
O(n)
任意数组A[0,n),将其前后颠倒
统一借口 void resverse(int * A ,int lo,int hi)
递归:
if(lo < hi)
{
swap(A[lo],A[hi]);
reverse(A,lo+1,hi-1);
}
迭代:
next:
if(lo < hi)
{
swap(A[lo],A[hi]);
lo++;hi--;
goto next;
}
迭代精简版:
while(lo < hi)swap(A[lo++],A[hi--]);