自考数据结构导论中,关于时间复杂度的题大概占到10分左右。简单的是给一个程序,让你看这个程序的时间复杂的。本人感觉比较难的就是直接问你一个算法的时间复杂度,因为算法的时间复杂度‘记’起来有点蒙啊!
排序算法复杂度表:
既然‘记’不住,那就想办法让自己加深印象呗!
1、时间复杂度的概念:
时间复杂度是指执行算法所需要的计算工作量。通俗的说也就是程序执行完毕运行的次数。
2、找规律:
容易计算的方法是:看看有几重for循环,只有一重则时间复杂度为O(n),二重则为O(n^2),依此类推,如果有二分则为O(logn),二分例如
快速幂、二分查找,如果一个for循环套一个二分,那么时间复杂度则为O(nlogn)。
3、扩展知识:
循环的语句有:for 、 while 、do while
二分:分两种或几种情况去运算。
排序分析、验证规律
直接插入排序:
void StraightInsertSort (List R、int n)
{int i,j;
for(i=2;i<=n;i++)
{R[0] = R[i];
j = i-1;
while (R[0].key<R[j].key)
{ R[j+1]=R[j];
j--;
}
R[j+1]=R[0];
}
}
for 循环中嵌套这 while循环 ,所以 直接插入排序的时间复杂度是O(n^2);
快速排序:
void Qsort(int a[], int low, int high)
{
if(low >= high)
{
return;
}
int first = low;
int last = high;
int key = a[first];/*用字表的第一个记录作为枢轴*/
while(first < last)
{
while(first < last && a[last] >= key)
{
--last;
}
a[first] = a[last];/*将比第一个小的移到低端*/
while(first < last && a[first] <= key)
{
++first;
}
a[last] = a[first];
/*将比第一个大的移到高端*/
}
a[first] = key;/*枢轴记录到位*/
Qsort(a, low, first-1);
Qsort(a, first+1, high);
while循环中嵌套这两个while语句,也就是分成22中情况,所以快速排序的时间复杂度为O(nlog2n)(以2为底n的对数)
时间复杂度分类:
按数量级递增排列,常见的时间复杂度有:
常数阶O(1),对数阶O(log2n),线性阶O(n),
线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3),...,
k次方阶O(n^k),指数阶O(2^n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
总结:关于时间复杂的的详解点我! 自己是在巨人的基础上加了点自己的理解,如果有不合适的地方,欢迎大神留言交流!