【问题标题】:Sorting a partially sorted array in O(n)在 O(n) 中对部分排序的数组进行排序
【发布时间】:2018-05-06 08:53:04
【问题描述】:

嘿,所以我真的被这个问题困住了。

我需要设计一种算法(不需要代码),将某个部分排序的数组排序为完全排序的数组。数组有 N 个实数,前 N-[N\sqrt(N)]([] 表示这个数的 floor)元素被排序,而其余的都没有。最后未排序的数字没有任何特殊属性,事实上,除了它们显然是与其他数字一样的实数之外,我没有被告知任何关于它们的信息。

关键是算法的时间复杂度需要为 O(n)。

我的第一个想法是尝试只对未排序的数字进行排序,然后使用合并算法,但我想不出任何可以在 O(n) 中工作的排序算法。所以我在想这一切都错了,有什么想法吗?

【问题讨论】:

  • N\sqrt(N)是什么意思? N除以N的平方根吗? (但在这种情况下,为什么不简单地说平方根 N)?如果它是 N 的 N 乘以 N 的平方根,它会高于 N,所以这个问题没有意义。
  • 是N除以N的平方根。我原来的帖子有一个错误,前N-[N\sqrt(N)]个元素是排序的。

标签: arrays algorithm sorting


【解决方案1】:

这在一般情况下使用基于比较的排序算法是不可能的。您很可能错过了问题中的某些内容。

想象一下部分排序的数组[1, 2, 3, 4564, 8481, 448788, 145, 86411, 23477]。它包含 9 个元素,其中前 3 个已排序(请注意 floor(N/sqrt(N)) = floor(sqrt(N)) 假设您的意思是 N/sqrt(N)floor(sqrt(9)) = 3)。问题是未排序的元素都在一个不包含已排序元素的范围内。它使数组的排序部分对任何排序算法都无用,因为它们无论如何都会留在那里(或者在它们大于未排序元素的情况下被移动到最后)。

使用这种输入,您仍然需要独立地对N - floor(sqrt(N)) 元素进行排序。据我所知,N - floor(sqrt(N)) ~ N~ 基本上意味着“与复杂性相同”)。因此,您剩下一个大约包含 N 元素的数组进行排序,在一般情况下这需要 O(N log N) 时间。

现在,我指定“使用基于比较的排序算法”,因为排序实数(在某个范围内,就像存储在计算机中的通常浮点数)可以在摊销 @ 987654330@ 时间使用散列排序(类似于计数排序),如果操作正确,甚至可以使用修改后的基数排序。但是数组的一部分已经排序这一事实并没有帮助。

【讨论】:

  • 你是对的,我错了!这个问题让我很困惑。有 N-[N\sqrt(N)] 排序的元素。在 N=9 的示例中,前 6 个元素将被排序。
【解决方案2】:

换句话说,这意味着数组末尾有 sqrt(N) 个未排序的元素。您可以使用 O(n^2) 算法对它们进行排序,该算法将给出时间 O(sqrt(N)^2) = O(N);然后做你提到的合并,它也将在 O(N) 中运行。因此,这两个步骤一起只需 O(N)。

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多