O(n)排序算法

时间:2011-02-02 02:31:31

标签: algorithm sorting

这是一个家庭作业问题,所以我想避免完整的答案,如果可能的话,我更喜欢提示。

给定随机整数A [1 ... x]的数组,程序应以递增顺序返回前y个数组元素,其中1 <= y <= sqrt(x)。所以,基本上,给定一个数组[5,9,2,8]和y = 2,程序应返回[2,5]。

“排序第一,返回前y项”答案在窗外,因为我们能做的最好的事情是n * logn time with merge或quicksort。答案因此必须利用我们只返回最多sqrt(x)项的事实,而我到目前为止唯一的另一个答案是对数组中的最小元素进行for循环搜索,从中删除最小值数组,将它存放在一个新的数组中,比如说B,然后在长度为x-1的A的现在较小的修改版本上重复这个过程,这给了我们这样的运行时间:

x + (x-1) + (x-2) + ... + (x-y)

它计算min-search的for循环迭代次数,并在最坏的情况下给出最多y或sqrt(x)次迭代,并且数组中最多有x个项。所以我们有sqrt(x)* x,它比O(n * logn)好,但仍然不是O(n):/。

4 个答案:

答案 0 :(得分:9)

提示:假设您有一个O(n)时间算法来选择y th 元素......

答案 1 :(得分:0)

实际上sqrt(x)比log(x)增长得快,因此O(x * sqrt(x))比O(n * log(x))更差。所以你还没有(比)对整个列表进行排序更好。

有几种方法可以解决这个问题。对于其中一个,请查看http://en.wikipedia.org/wiki/Sorting_algorithm#Summaries_of_popular_sorting_algorithms并查看所有常见的排序算法。哪种算法可以最有效地为您提供前几个元素?

答案 2 :(得分:0)

  

其中1 <= y <= sqrt(x)

请注意此要求为您提供的服务。如果y≤√x,那么y logy≤(√xlogx)/2∈O(x ½ log x)⊂O(x)。

Sort-then-filter可能在窗外,但filter-then-sort是可以接受的。

答案 3 :(得分:-1)

对于y,使用快速排序的想法,选择一个随机数并将其分为两部分。 Part1(较小)和part2(较大)。
如果Part1的长度< y,然后使用y'= y - len(Part1)在Part2中进行分区 如果Part1的长度> y,然后使用y'= y在Part1中进行分区 如果Part1的长度== y,则对Part1进行排序。

对于分区,平均值应该几乎是O(n)(我现在不能批准它,但它很快)(我会尝试为这部分找到一些材料)..
按y排序需要ylog(y)&lt; sqrt(x)log(sqrt(x)) - &gt; 1/2 * sqrt(x)* log(x)&lt; 1/2 * sqrt(x)* sqrt(x)=&gt; 1/2 x。