В зависимости от ваших ограничений памяти, вы можете использовать модифицированную версию алгоритма медианы медиан для решения проблемы за время O (n) и пространство O (k).
Идея состоит в том, чтоследующим образом.Поддерживать массив размером 2 КБ в памяти.Заполните этот буфер первыми 2k элементами из массива, затем запустите на нем алгоритм медианы медиан, чтобы поместить самые большие k элементов в первой половине массива и наименьшие k элементов во второй половине.Затем откажитесь от наименьших k элементов.Теперь загрузите следующие k элементов во вторую половину массива, используйте алгоритм медианы медиан, чтобы снова поместить верхние k элементов слева и нижние k элементов справа.Если вы проведете этот процесс по всему массиву - заменив вторую половину буфера следующими k элементами из массива, а затем, используя медиану медиан, переместите верхние k из них в левую половину - тогда в конце вы получитеиметь верхние k элементов в левой половине массива.Нахождение наименьшего из них (за O (k) время) даст вам k-й наибольший элемент.
В целом вы в конечном итоге делаете O (n / k) вызовов алгоритма медианы медиан смассив размера O (k), который представляет собой O (n / k), для вызова алгоритма, который занимает время O (k), для чистого времени выполнения O (n).Это, в сочетании с последним этапом, выполняется за O (n + k) = O (n) время.Кроме того, поскольку использование памяти для шага медианы медиан составляет O (k), а поскольку у вас есть буфер размером O (k), он использует только O (k) памяти.Другими словами, это асимптотически быстрее, чем решение с минимальной кучей, и асимптотически эквивалентно в памяти.
Надеюсь, это поможет!