33、证明 n lg n 属于 O(n²)。
要证明 $ n \lg n \in O(n^2) $,可根据定理:若
$$
\lim_{n \to \infty} \frac{g(n)}{f(n)} = c \quad (c \geq 0)
$$
则 $ g \in O(f) $。
这里 $ g(n) = n \lg n $,$ f(n) = n^2 $,计算
$$
\lim_{n \to \infty} \frac{n \lg n}{n^2} = \lim_{n \to \infty} \frac{\lg n}{n}
$$
因为
$$
\lim_{n \to \infty} \lg n = \infty, \quad \lim_{n \to \infty} n = \infty
$$
且这两个函数的一阶导数都存在,所以可以使用洛必达法则。
对分子分母分别求导,得
$$
\lim_{n \to \infty} \frac{\lg n}{n} = \lim_{n \to \infty} \frac{\frac{1}{n \ln 2}}{1} = \lim_{n \to \infty} \frac{1}{n \ln 2} = 0
$$
由于该极限为 $ 0 $($ 0 \geq 0 $),所以
$$
n \lg n \in O(n^2)
$$
34、证明:若a, b ≥ 0 且 a ≤ b,则 n^a 属于 O(n^b)。
根据定理,若
$$
\lim_{n \to \infty} \frac{g(n)}{f(n)} = c \quad (c \geq 0)
$$
则
$$
g \in O(f)
$$
对于本题,需考虑
$$
\lim_{n \to \infty} \frac{n^a}{n^b}
$$
即
$$
\lim_{n \to \infty} n^{a - b}
$$
因为 $ a \leq b $,所以 $ a - b \leq 0 $。
-
当 $ a - b = 0 $ 时,
$$
\lim_{n \to \infty} n^{a - b} = \lim_{n \to \infty} 1 = 1
$$ -
当 $ a - b < 0 $ 时,
$$
\lim_{n \to \infty} n^{a - b} = 0
$$
这两种情况下极限值 $ c $ 都满足 $ c \geq 0 $,所以
$$
n^a \in O(n^b)
$$
35、重写冒泡排序算法,使其在每次遍历后检查数组是否已排序,并在数组已排序时停止处理。
可在原冒泡排序算法基础上添加一个布尔变量来标记是否发生交换。若某次遍历未发生交换,说明数组已排序,可停止处理。以下是改进后的伪代码:
def bubble_sort(array):
n = len(array)
for j in range(n - 1, 0, -1):
swapped = False
for i in range(1, j + 1):
if array[i] < array[i - 1]:
array[i], array[i - 1] = array[i - 1], array[i]
swapped = True
if not swapped:
break
return array
36、调整选择排序算法,使用未排序部分数组中的最大值而非最小值进行排序。
要将选择排序算法调整为使用最大值而非最小值进行排序,需要修改算法中选择元素的逻辑,使其每次选择未排序部分的最大值并将其放到未排序部分的末尾。以下是修改后的 Ruby 代码实现:
def selection_sort_max(array)
(array.size - 1).downto(1).each do |j|
max_index = j
0.upto(j - 1).each do |i|
max_index = i if array[i] > array[max_index]
end
array[j], array[max_index] = array[max_index], array[j]
end
return array
end
上述代码中,外层循环控制未排序部分的末尾位置,内层循环遍历未排序部分,找到最大值的索引,然后将最大

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



