复杂度和顺序表
〇.写在前面
若读者朋友们发现问题,请不吝斧正。
一.复杂度
1.算法的好坏取决于它的效率,复杂度便可以用来衡量它的效率。
2.复杂度分为时间复杂度和空间复杂度。
3.时间复杂度为算法中基本操作执行的次数,空间复杂度为算法运行时额外申请的空间。
4.时间复杂度和空间复杂度都用大o的渐进表示法表示。
5.递归算法的空间复杂度 = 每次递归的空间复杂度 * 递归深度
(1)斐波那契数列的复杂度
计算斐波那契数列的第n个数,该数列第1,2个数为1,第n个数为第n-1个数与第n-2个数的和(n>2)。
//递归算法
int Fib1(int n)
{
if (n == 1 || n == 2)
return 1;
else
return Fib1(n - 1) + Fib1(n - 2);
}
//循环算法
int Fib2(int n)
{
int prev = 0;
int next = 1;
int tmp = 0;
while (--n)
{
tmp = next;
next = prev + next;
prev = tmp;
}
return next;
}
递归算法的计算次数约为2n,故时间复杂度为o(2n);
空间复杂度 = 每次递归的空间复杂度 * 递归深度 = 1*n = n,故空间复杂度为o(n);
而循环算法的时间复杂度为o(n),空间复杂度为o(1);
虽然递归算法的代码简洁,却比循环算法的效率低。要衡量代码的好坏,还是要看它的复杂度。
(2)冒泡排序的复杂度
void BubbleSort(int* a,int n)
{
int i = 0;
int tmp = 0;
int j =