减少正数排序任务以证明 nlogn 复杂性

Reduction for positive number sorting task to prove nlogn complexity

事实证明,基于比较的排序具有复杂性 T(n)=nlogn。因此,如果我们有正整数数组(不是特定的整数,因此无法应用 countingradix 排序)如何确定从 SortSortPositiveNumbers 的适当减少(对于示例)为了证明存在多项式和正确的变换并且 SortPositiveNumbers 也有 nlogn 的下界?

如有任何帮助,我们将不胜感激。

假设您可以对复杂度为 C' < nlogn 的正数进行排序。然后我可以通过将任意数组分成正数和负数 (O(N)) 将负数转换为正数 (O(N)) 对两个数组进行排序 (O(C'),乘以 2 来排序,但这并不重要复杂度),反转负数组 O(N) 并连接两个数组 (O(N))。因此,即使总体而言,复杂度也是 O(N + C')(即 O(N) 和 O(C') 之间的最大值)。这低于 nlogn ,您已证明这是对任意数组进行排序的最低复杂度。这是一个矛盾,因此最初的假设(我们所做的唯一假设)是错误的。那就是有一个复杂度小于 nlogn 的 co 算法来对正数进行排序。

我们可以使用以下伪代码将 Sort 简化为 SortPositiveNumbers:

Sort(A[1..n])
   B[1..n]
   p <- n+1
   s <- 0
   for k <- 1 to n
       if A[k] > 0
          p <- p-1
          B[p] <- A[k]
       else if A[k] < 0
          s <- s+1
          B[s] <- -A[k]

   SortPositiveNumbers(B[1...s])
   SortPositiveNumbers(B[p...n])

   for k <- 1 to s
       A[k] <- -B[s+1-k]
   for k <- s+1 to p-1
      A[k] <- 0
   for k <-p to n
      A[k] <- B[k]

这里的归约是线性的 (2n),所以它是多项式的并且是正确的,因为它使用 SortPositiveNumbers 仅对 A 中的正数进行排序(负数转换为正数)最后再次归约将正数转换为负数,并且将它们添加到排序数组的所需索引中。