算法与数据结构问题解析

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

上述代码中,外层循环控制未排序部分的末尾位置,内层循环遍历未排序部分,找到最大值的索引,然后将最大

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值