嘿所以我真的只是坚持这个问题。
我需要设计一种算法(不需要代码),将某个部分排序的数组分类为完全排序的数组。该数组具有N 实数,并且第一个N [N \ sqrt(N)]([]表示此数字的 floor )元素被排序,而是其余的不是。最后没有特别属性给未分类的数字,事实上除了它们显然是真实的数字之外,我没有被告知任何其他内容。
踢球者的时间复杂度需要为O(n)。
我的第一个想法是尝试仅对未排序的数字进行排序,然后使用合并算法,但我无法弄清楚在O(n)中可以使用的任何排序算法。所以我想这都错了,有什么想法吗?
答案 0 :(得分:0)
在使用基于比较的排序算法的一般情况下,这是不可能的。你很可能会遗漏这个问题。
想象一下部分排序的数组[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
(~
基本上意味着"与#34;相同的复杂性。因此,您需要排序大约N
个元素的数组,这在一般情况下需要O(N log N)
次。
现在,我指定"使用基于比较的排序算法",因为排序实数(在某个范围,就像存储在计算机中的常用浮点数一样)可以使用哈希排序(类似于计数排序)在摊销O(N)
时完成,或者如果正确完成,甚至可以修改基数排序。但是阵列的一部分已经排序的事实并没有帮助。
答案 1 :(得分:0)
换句话说,这意味着数组末尾有sqrt(N)个未排序元素。您可以使用O(n ^ 2)算法对它们进行排序,该算法将给出O(sqrt(N)^ 2)= O(N)的时间;然后执行你提到的合并,它也将在O(N)中运行。因此,两个步骤一起只需要O(N)。