Я сделал это в интервью раньше, и один из самых элегантных / эффективных способов сделать это:
O(n log k).
with space: O(k) (thanks, @Nzbuu)
В основном вы собираетесь использовать максимальную кучу размера, ограниченного до k. Для каждого элемента массива проверьте, меньше ли он (только O (1)). Если это так, поместите это в кучу (O (log k)) и удалите макс. Если он больше, перейдите к следующему пункту.
Конечно, куча не дает отсортированный список из k элементов, но это можно сделать в O (k log k), что легко.
Точно так же вы можете сделать то же самое для поиска наибольших k-элементов, и в этом случае вы будете использовать мини-кучу.