【问题标题】:Time complexity for modification on quicksort快速排序修改的时间复杂度
【发布时间】:2025-12-30 15:10:07
【问题描述】:

让一个名为 QUARTERSORT 的函数获取一个数组并按以下方式对其进行排序:

  • 如果 n
  • 否则,我们将数组拆分为A1 = A[1,...,n/4]A2 = A[(n/4)+1,...,n]
  • 然后,我们调用 QUARTERSORT 两次:B1 = QUARTERSORT(A1)B2 = QUARTERSORT(A2)
  • 最后,我们合并B1B2

现在,为什么重复出现T(n) = T(0.25n) + T(0.75n) + O(n) 而不是T(n) = T(0.25n) + T(0.75n) + O(nlogn)

【问题讨论】:

    标签: algorithm sorting data-structures time-complexity quicksort


    【解决方案1】:

    直观地说,你可以忽略关于快速排序的部分,因为它只发生在小的 n 上,而大 O 表示法只讨论“足够大”的 n 的值。所以算法的部分是:

    1. 在输入的 1/4 上递归调用:T(1/4 * n)
    2. 在输入的 3/4 上递归调用:T(3/4 * n)
    3. 正在合并:O(n)

    更正式一点:快速排序的时间复杂度是O(1)。可以放心地忽略此添加,因为时间复杂度中有较大的部分,例如O(n)

    【讨论】:

    • 谢谢。顺便问一下,这种复发的解决方案是什么?我的猜测是 O(nlogn),但如何显示呢?
    • 只需将循环插入自身,直到所有数字变为 1(或任何其他常数)。还有Master theorem,但我不确定它是否适用于此。更新:刚看了*的文章;它包含一个更通用的“Akra–Bazzi 方法”的链接,在这种情况下肯定会起作用。
    【解决方案2】:

    递归是T(n) = T(0.25n) + T(0.75n) + O(n),因为算法的每一步都是O(n)。将数组分成两部分是O(n),合并两部分是O(n),所以每一步都是O(n),这给了我们预期的T(n) = T(0.25n) + T(0.75n) + O(n)

    【讨论】:

    • 谢谢。顺便问一下,这种复发的解决方案是什么?我的猜测是 O(nlogn),但如何显示呢?
    【解决方案3】:

    快速排序需要O(n) 来找到枢轴。一旦找到枢轴,它就保持不变。

    2个子问题的大小分别为O(N/4)和O(3N/4),所以递归为

    T(n) = T(0.25n) + T(0.75n) + O(n)

    【讨论】:

    • 谢谢。顺便问一下,这种复发的解决方案是什么?我的猜测是 O(nlogn),但如何显示呢?