c – 搜索算法以查找列表中的k个最低值

我有一个包含n个double值的列表,我需要在该列表中找到k个最低的double值

> k远小于n
>具有n个double值的初始列表是随机排序的
>找到的k个最低的double值不需要排序

你会推荐什么算法?

目前我使用Quicksort对整个列表进行排序,然后我从排序列表中取出前k个元素.我希望应该有一个更快的算法.

谢谢您的帮助!!!

最佳答案
您可以使用selection algorithm找到第k个最低元素,然后迭代并返回它以及低于它的所有元素.如果列表可以包含重复项,则必须完成更多工作(确保您不会得到所需的更多元素).
该解决方案是O(n).
选择算法在C中实现为nth_element()

另一种方法是使用大小为k的max heap,并迭代元素,同时保持堆以保存所有k个最小元素.

for each element x:
   if (heap.size() < k):
      heap.add(x)
   else if x < heap.max():
      heap.pop()
      heap.add(x)

完成后 – 堆包含k个最小元素.
这个解决方案是O(nlogk)

转载注明原文:c – 搜索算法以查找列表中的k个最低值 - 代码日志