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为常量),因此
因为,所以
即