假设有一个包含 n 个整数的数组 S(不一定排序),设计一个算法来查找 S 中前 10 个最大的整数(并将这些整数存储在一个长度为 10 的新数组中)。你的算法必须在 O(n) 时间内完成。
我曾尝试使用计数排序,然后将最后 10 个元素添加到新数组中来回答这个问题。但显然这是错误的。有没有人知道更好的方法?
假设有一个包含 n 个整数的数组 S(不一定排序),设计一个算法来查找 S 中前 10 个最大的整数(并将这些整数存储在一个长度为 10 的新数组中)。你的算法必须在 O(n) 时间内完成。
我曾尝试使用计数排序,然后将最后 10 个元素添加到新数组中来回答这个问题。但显然这是错误的。有没有人知道更好的方法?
方法1:您可以使用FindMax()算法,在O(N)
中查找最大数字,如果您将其使用10次:
10 * O(N) =O(N)
FindMax();
时将忽略它。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)
方法三:
您可以使用 MAX 堆
:
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)
将它们插入到平衡二叉树中。O(N) + O(lg2 N)。