在O(n)时间内在数组中找到10个最大的整数

时间:2016-09-13 03:54:57

标签: arrays algorithm time-complexity

设S是存储在数组中的一组n个整数(不一定是排序的)。设计一种算法来查找S中的10个最大整数(通过创建一个长度为10的单独数组来存储这些整数)。您的算法必须在O(n)时间内完成。

我想我可以通过使用count排序然后将最后10个元素添加到新数组中来回答这个问题。但显然这是错误的。有谁知道更好的方法吗?

4 个答案:

答案 0 :(得分:4)

方法1: 您可以使用FindMax()算法查找O(N)中的最大数字,如果您使用它10次:

10 * O(N) =O(N)

每次找到max num时,都会将其放入新数组中,下次使用FindMax();

时会忽略它

方法2:

你可以使用Bubble 10次:

1) Modify Bubble Sort to run the outer loop at most 10 times.
2) Save the last 10 elements of the array obtained in step 1 to the new array.

10 * O(N) =O(N)

方法3:

您可以使用MAX Heap

1) Build a Max Heap in O(n)
2) Use Extract Max 10 times to get 10 maximum elements from the Max Heap 10
* O(logn)

 O(N) + 10 * O(logN) = O(N)

答案 1 :(得分:1)

使用order statistic算法查找第10大元素。 接下来,迭代数组以找到所有小于/等于它的元素。

TimeComplexity:O(n)用于顺序统计+ O(n)用于迭代数组一次=>为O(n)

答案 2 :(得分:0)

访问:

http://www.geeksforgeeks.org/k-largestor-smallest-elements-in-an-array/

他们已经提到了六种方法。

答案 3 :(得分:-1)

将它们插入平衡二叉树中。 O(N)+ O(lg2 N)。