Да, более эффективные алгоритмы существуют.
Получить k первых элементов, построить min - кучу, содержащую эти k элементов.
Пройдите через другие элементы. Если текущий элемент больше кучи, удалите верх и вставьте текущий элемент.
После конца куча будет содержать k самых больших элементов.
Сложность O(N*logK)
Также рассмотрим алгоритм QuickSelect со средним временем O (n) (в то время как он имеет наихудший случай вплоть до квадратичного)