1
Θ ( n 3 ) \Theta(n^3) Θ(n3)
2
选择排序的伪码:
for i = 1 to A.length - 1
min = i
for j = i to A.length
if A[j] < min
min = j
swap(a[i], a[min])
最外层 for 的循环不变量:每次迭代开始时 A A A 的子数组 A [ 1 … i − 1 ] A[1\dots i-1] A[1…i−1] 是非递减排列的。
每次迭代开始时 A A A 的子数组 A [ 1 … i − 1 ] A[1\dots i-1] A[1…i−1] 是非递减排列的,且是数组 A A A 中最小的 i − 1 i-1 i−1 个元素。
为什么只需要跑 n - 1 次?因为第 n - 1 次迭代结束后, A A A 的子数组 A [ 1 … A . l e n g t h − 1 ] A[1\dots A.length-1] A[1…A.length−1] 是非递减排列的,且 A [ A . l e n g t h ] A[A.length] A[A.length] 显然是数组中最大的数,所以 A A A 是非递减排列的。
时间复杂度:最好情况: Θ ( n 2 ) \Theta(n^2) Θ(n2),最坏情况: Θ ( n 2 ) \Theta(n^2) Θ(n2)
3
平均检查次数:
1
n
∑
i
=
1
n
i
=
n
+
1
2
\frac{1}{n}\sum_{i=1}^ni=\frac{n+1}{2}
n1∑i=1ni=2n+1,时间复杂度
Θ
(
n
)
\Theta(n)
Θ(n)
最坏情况的检查次数:
n
n
n,时间复杂度
Θ
(
n
)
\Theta(n)
Θ(n)
4
把所有算法都按照最好情况下的输出来优化代码。
为所有算法都加上一个特殊情况,如果输入满足这种特殊情况的话就返回预先准备好的输出。
注:引用里的解答都是看这个网站写的:CLRS Solutions