数据结构与算法(二)--算法的时间复杂度

一.算法时间复杂度

1.使用递归实现 i~j的累加:

#include<stdio.h>
int fun(int k,int n){
    if(n<=k){        //最后一个数 
        return k;    //函数出口 
    } 
    else{
        return fun(k,n-1)+n;  //递归累加,将本次的n与n-1相加并继续计算
    }
    
}
int main(){
    int result = fun(1,100);
    printf("%d",result);
    return 0;
}

运行结果:

return fun(k,n-1)+n;该语句执行的频度是为T(n).

时间复杂度为O(N),因为本程序中返回的fun函数是从n往前递减与本次的n相加,直到n<=k时的n加上返回的k得到最后的结果。

2.优化时间复杂度

使用C实现二分排序:

#include<stdio.h>

int a[101],n;
void quick_sort(int left,int right) {
	int i , j, temp ,t;
	if(left > right){
		return;
	}
	temp = a[left];		//以第一个数为基准
	i = left;
	j = right;
	while(i!=j){
		while(a[j]>=temp && i<j){	//从后往前与temp比较 
			j--;			//temp比不过a[j],前移一位继续与temp比较 
		}
		while(a[i]<=temp && i<j){	//从前往后与temp比较 
			i++;			//temp比a[i]大则与后一位继续比较 
		}
		if(i<j){	//直到不满足以上条件了 
			//交换数组
			t = a[i];
			a[i] = a[j];
			a[j] = t; 
		} 
	}
	a[left] = a[i];	//将交换的这一个数组重新指定为临时变量
	a[i] = temp;	//将一开始的临时变量放到该位置 
    //以交换的位置为界分开处理,继续二分处理 
	quick_sort(left,i-1);   
	quick_sort(i+1,right);
	return ;
}

int main(){
	int i;
	printf("输入总共多少个数据:\n");
	scanf("%d",&n);
	printf("输入准备排序的数据:\n"); 
	for( i = 1;i <= n; i++){
		scanf("%d",&a[i]);
	}
	quick_sort(1,n);
	printf("快速排序后的数据:\n"); 
	for( i = 1;i <= n; i++){
		printf("%d ",a[i]);
	}
}

使用二分法能够降低代码的执行次数从而优化了时间复杂度,运算次数为:ASL={[(n+1)/n]*log2^(n+1)}-1所以该程序的时间复杂度为O(log2N)。

其程序的运行结构为树形结构:

3.最坏时间复杂度.

冒泡实现排序:

#include <stdio.h>
 
int main(){
	int a[10];
	int i,j,temp=0;
	printf("输入准备排序的数字:");
	for(i = 0;i<10;i++){
		scanf("%d",&a[i]);
	}
	for(i=0;i<9;i++){	//从a[0]开始与其他数组比较 
		for(j=0;j<10-i;j++){		// 排好的数组放在n-i位的后一位,所以不需要与这些数组比较 
			if(a[j+1]<a[j]){	//从小到大排序
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}	
	}
	for(i=0;i<10;i++){
		printf("%3d",a[i]);
	} 
	return 0;
}

运行结果:

从时间看出来运行了3.999s的时间,该算法最差情况下的时间复杂度是n*n即(n^2).

发布了58 篇原创文章 · 获赞 31 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_37504771/article/details/104255161