从数组中查找n个最大元素

时间:2014-03-26 07:47:52

标签: c

我有一个数组

A[4]={4,5,9,1}

我需要它会给出前3个顶级元素,如9,5,4

我知道如何找到最大元素,但如何找到第2和第3个最大元素?

即如果

max=A[0]
for(i=1;i<4;i++)
{
  if (A[i]>max)
  {
    max=A[i];
    location=i+1;
  }
}

实际排序不适合我的应用程序,因为,

位置编号对我来说也很重要,即我必须知道前三个最大值发生在哪个位置,这里是第0,第1和第2位......所以我在考虑逻辑

在获得最大值之后,如果我可以在该位置放置0并且可以对该新阵列应用相同的步骤,即{4,5,0,1}

但我对如何将我的逻辑放在代码中感到困惑

4 个答案:

答案 0 :(得分:3)

考虑使用Python标准库中使用的技术。它使用底层堆data structure

def nlargest(n, iterable):
    """Find the n largest elements in a dataset.

    Equivalent to:  sorted(iterable, reverse=True)[:n]
    """
    if n < 0:
        return []
    it = iter(iterable)
    result = list(islice(it, n))
    if not result:
        return result
    heapify(result)
    for elem in it:
        heappushpop(result, elem)
    result.sort(reverse=True)
    return result

步骤如下:

  1. 创建 n 长度固定数组以保存结果。
  2. 使用输入的第一个 n 元素填充数组。
  3. 将数组转换为minheap
  4. 循环其余输入,如果新数据元素较大,则替换堆的顶部元素。
  5. 如果需要,请对最终的 n 元素进行排序。
  6. 堆方法具有内存效率(不需要比目标输出更多的内存),并且通常具有非常少的比较(请参阅此comparative analysis)。

答案 1 :(得分:2)

您可以使用selection algorithm

另外要提到的是复杂度为O(n),即O(n)用于选择,O(n)用于迭代,因此总数也是O(n)

答案 2 :(得分:0)

您的本质要求相当于按降序排序数组。最快的方法是使用heapsortquicksort,具体取决于数组的大小。

一旦你的数组被排序,你的最大数字将在索引0,你的第二大数字将在索引1,....,一般来说你的第n个最大数字将在索引n-1

答案 3 :(得分:0)

你可以遵循这个程序,
1 即可。将n个元素添加到另一个数组B[n];
2 即可。对数组B[n]进行排序 <强> 3 即可。然后对A[n...m]中的每个元素进行检查,
    A[k]>B[0]    如果是这样,那么数字A[k]就是n个大元素之一,所以,
   在A[k]中搜索B[n]的正确位置,并替换并移动B[n]左侧的数字,以便B[n]包含n个大元素。
4 即可。对A[m]中的所有元素重复此操作 最后B[n]将包含n个最大的元素。