我们希望找到数组

时间:2017-12-21 04:08:39

标签: algorithm sorting data-structures

如何在3n + o(n)比较中完成?

我试图获取一个大小为7的数组(a [6])并遍历给定的数组。然后按照排序顺序将元素插入到[]中(在第一个7之后的每个插入的6log(6)比较和之前的o(6))。所以总比较= n-7(7log(7))+ 6( 6 + 1)/ 2比我想要的要大。有人可以描述一种算法来解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

让我们遍历输入数组A并在每次迭代时维护包含7个最小元素的有序数组smallest

smallest = [INF, INF, INF, INF, INF, INF, INF]
for each Number in A
    find the insert position of the Number (if any) in the smallest array with binary 
        search (3 comparisons)
    insert to the smallest if needed (0 comparisons)

最后,我们有7个最小元素,比较总数为3*n

如果我们没有INF模拟元素,我们可以先获取7个元素并对它们进行排序(这种类型为O(1)),然后遍历数组的剩余部分。在这种情况下,比较次数等于(n-7)*3 + O(1) = 3*n + O(1)

答案 1 :(得分:0)

您可以使用QuickSelect算法(https://en.wikipedia.org/wiki/Quickselect)。平均运行时间为O(n)。

  
      
  • 无,也没有时间限制,但比较次数应在3n + o(n)之内。
  •   
  • 它可以使用任何空间和时间。
  •   

您还提到,只要您满足比较要求的数量,就没有时间要求。有一些排序算法可以进行零元素比较。如果您的数据是整数,则可以使用基数排序(https://en.wikipedia.org/wiki/Radix_sort)。