如何为以下循环找到时间复杂性。
1)
int I, j, k, n, mini, tmp;
for(i = 0; i< k; i++){
mini = i;
for(j =i +1; j < n; j++)
if (a[j] < a[mini])
mini = j;
tmp = a[i];
a[i] = a[mini];
a[mini] = tmp;
}
return a[k-1];
}
2)
void SelectionSort(int A[], int n) {
int i = 0;
while (i < n - 1) {
int j = i + 1;
while (j < n) {
if (A[j] < A[i])
swap(A[j], A[i])
j++;
}
i++;
}
}
答案 0 :(得分:0)
两者都是O(n^2)
1,2
在两者中,外部循环从0到n(不包括)运行,并且对于每次迭代 - 内部循环从i + 1运行到n(不包括)。
如果我们总结内循环的运行时间,我们得到:
n- (0+1) + n- (1+1) + .... + n-(n-1 + 1) =
= n-1 + n-2 + .... + 0 =
0 + 1 + ... + n-1 = (*)
n(n-1)/2
位于O(n^2)
等式(*)来自sum of aritmetic progression。
作为旁注 - 两者都是排序算法,第一个是最小排序,第二个是函数名称,选择排序。
(1)从技术上讲,第一个是O(k^2)
,但我认为这意味着相同。
(2)假设return a[k-1];
应该在关闭外环的范围之后,它的位置是错误的。如果不是错误 - 外部循环只运行一次,复杂性为O(n)
。