时间复杂度

void func(int n)
{
	int i = 0;
	int s = 0;
	while (s < n)
	{
		++i;
		s += i;
	}
}

经分析知,循环结束时i的值就是while循环执行的次数,可得出式子:

1+2+…+i=n

以下算法用于求含n个整数元素的序列中前i(1≤i≤n)个元素的最大值,分析该算法的最好、最坏和平均时间复杂度。

int fun(int a[], int n, int i)
{
	int max = a[0];
	for (int j = 1; j <= i - 1; ++j)
	{
		if (a[j] > max)
			max = a[j];
	}
	return max;
}

平均时间复杂度:

最好时间复杂度:B(n)=O(1),当i=1时,没有两个元素之间的比较

最坏时间复杂度:W(n)=n-1=O(n),当i=n-1时,需要n-1次两个元素之间的比较,对应最坏的时间复杂度

int fun(int a[], int n, int k)
{
	int i;
	if (k == n - 1)
	{
		for (i = 0; i < n; ++i)
			cout << a[i] << endl; //语句①执行次数为n
	}
	else
	{
		for (i = k; i < n; ++i)
			a[i] = a[i] + i * i; //语句②执行次数为n-k
		fun(a, n, k + 1); 
	}
}

调用以上算法的语句是fun(a, n, 0),求其时间复杂度。

解:分析知,该算法的功能为

由于算法的执行时间仅与语句①、②有关,故可设fun的执行时间为,fun(a, n, 0)的执行时间为T(n),显然有,由fun()算法得到以下执行时间的递推式:

则:

// 选择排序,从小到大
void fun2(int b[], int n)
{
	for (int i = 0; i < n - 1; ++i)
	{
		int k = i; // 最小值下标
		for (int j = i + 1; j < n; ++j)
			if (b[k] > b[j])
				k = j;
		int x = b[i];
		b[i] = b[k];
		b[k] = x;
	}
}

 

// 对数组a[i…j]的元素进行归并排序
void mergeSort(int a[], int i, int j)
{
	int m = (i + j) / 2;
	if (i != j)
	{
		mergeSort(a, i, m);
		mergeSort(a, m + 1, j);
		merge(a, i, j, m);
	}
}

 该递归算法用于对数组a[i…j]的元素进行归并排序,求执行mergeSort(a, 0, n - 1)的时间复杂度。其中,merge(a, i,  j, m)用于两个有序子序列a[i…m]和a[m+1…j]的合并,是非递归函数,它的时间复杂度为O(合并的元素个数)。

解:,其中O(n)为merge()所需的时间,设为cn(c为常量),因此

 因为,所以

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值