Как уже говорили, вы можете пройтись по списку, отслеживая K самых больших значений. Если K велико, этот алгоритм будет близок к O (n 2 ).
Однако вы можете сохранить ваши самые большие K-ые значения в виде двоичного дерева, и операция станет O (n log k).
Согласно Wikipedia, это лучший алгоритм выбора:
function findFirstK(list, left, right, k)
if right > left
select pivotIndex between left and right
pivotNewIndex := partition(list, left, right, pivotIndex)
if pivotNewIndex > k // new condition
findFirstK(list, left, pivotNewIndex-1, k)
if pivotNewIndex < k
findFirstK(list, pivotNewIndex+1, right, k)
Его сложность O (n)