(摘自大话数据结构)推导时间复杂度O()的方法:
1、用常数1取代运行时间中的所有加法常数
2、在修改后的运行次数函数中,只保留最高阶项
3、如果最高阶项存在且不是1,则去除与这个项相乘的常数。最终得到的结果就是大O阶
例子:
1、
int a=1,b=2;
int sum = a+b;
System.out.println(sum);
这个算法的执行次数很明显是1+1+1=3次,根据上述推导方法,要讲运行时间中的加法常数3用1代替,也就是说该程序的时间复杂度是O(1);
2、
for(int i=0;i<n;i++){
System.out.println(i);
}
该程序的执行次数是n,由于没有常数项,保留最高阶项n,那么该程序的时间复杂度是O(n)。
3、
int i=1;
while(i<n){
i=i*2;}
该程序的执行次数的计算方法是,
2x=n
,得到
x=log2n
,所以这个程序的时间复杂度是
O(log2n)
。
4、
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.println(i+j);}}
该程序的执行次数显然是 n∗n=n2 ,因此时间复杂度是 O(n2) 。
for(int i=0;i++i<n){
for(int j=i;j<n;j++){
System.out.println(i+j);}}
该程序的执行次数是 n+(n−1)+...+1=(1+n)∗n2=n22+n2 ,根据推导法则,只保留最高阶,并将最高阶系数置为1,也就是该程序的时间复杂度是 O(n2) 。
总结各个排序算法的时间复杂度
注意:在没有特殊说明的情况下,所谓的时间复杂度指的是最坏时间复杂度
排序法 | 平均时间复杂度 | 最好时间复杂度 | 最差时间复杂度 | 稳定性 |
---|---|---|---|---|
直接插入排序 | O(n2) | O(n) | O(n2) | 稳定 |
简单选择排序 | O(n2) | O(n2) | O(n2) | 不稳定 |
堆选择排序 | O(nlogn) | O(nlogn) | O(nlogn) | 不稳定 |
冒泡交换排序 | O(n2) | O(n) | O(n2) | 稳定 |
快速交换排序排序 | O(nlogn) | O(nlogn) | O(n2) | 不稳定 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | 稳定 |