我有一个数组
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}
但我对如何将我的逻辑放在代码中感到困惑
答案 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
步骤如下:
堆方法具有内存效率(不需要比目标输出更多的内存),并且通常具有非常少的比较(请参阅此comparative analysis)。
答案 1 :(得分:2)
您可以使用selection algorithm
另外要提到的是复杂度为O(n),即O(n)用于选择,O(n)用于迭代,因此总数也是O(n)
答案 2 :(得分:0)
您的本质要求相当于按降序排序数组。最快的方法是使用heapsort或quicksort,具体取决于数组的大小。
一旦你的数组被排序,你的最大数字将在索引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个最大的元素。