Я могу придумать 3 возможных решения:
1. Сортировка
Это решение, которое вы дали. Временная сложность будет O (n * log (n)) , где n - количество элементов между нижней границей и верхней границей.
2. Куча
Совершенно аналогично первому решению, но это немного уменьшит временную сложность. Весь смысл в том, чтобы создать приоритетную очередь и добавить элементы из нижней границы в верхнюю, сохраняя при этом размер очереди приоритета как K. Когда размер переполняется, просто удалите из очереди самый маленький элемент. Тогда в очереди с приоритетами останется K самых больших элементов в пределах границ. Опрос наименьшего элемента из этой приоритетной очереди даст Kth наибольший элемент. Сложность по времени будет O (n * log (k)) , поскольку опрос занимает время log (k) из-за поддерживаемого размера K.
PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
for (int j = l-1; j < r; j++) {
pq.add(arr[j]);
if (pq.size() > k) pq.poll();
}
System.out.println(pq.poll());
3. Быстрый выбор
Это известно как Алгоритм выделения Хоара , очень похожий на быструю сортировку. Временная сложность будет в среднем O (n) , но в худшем случае O (n ^ 2) . Вот страница Википедии, на которую вы можете сослаться: https://en.wikipedia.org/wiki/Quickselect