скажу честно, код не смотрел. Но подскажу идею, куда копать (С++). Используй частичную сортировку. Код приведён скорее для демонстрации различных фичей стандартной библиотеки, чем шаблона partial_sort. Рабочий, проверял.
Код:

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <string>
using namespace std;
//------------------------------------
int main()
{
// расположив строчку и вектор здесь, мы позволяем программе реже
// обращаться в менеджеру памяти, потому что эти контейнеры постепенно
// захватывают память по мере надобности и держат её на всякий случай.
// освободить её можно либо уничтожив контейнер, либо выполнив хитрую операцию:
// word_end.swap(string());
// values.swap(vector<int>());
string word_end;
unsigned sort_limit = 0;
vector<int> values;
for (bool working=true; working;)
{
cout << "\nEnter values separated with spaces and \"end\" at the end:\n";
// ввод данных
copy(istream_iterator<int,char>(cin), istream_iterator<int,char>(), back_inserter(values));
// слово end - не целое число, поэтому поток будет помечен как ios::failbit
if (!cin.eof() && !values.empty())
{
// снимаем эту пометку, проверяем что ввели хотя бы один элемент
cin.clear(ios::goodbit);
// убедились что именно слово end на конце, сняли слово из потока
if ((cin >> word_end) && word_end=="end")
{
// ввод и проверка границ для sort_limit
// помним, что в си нумерация идёт с нуля, и что -1 = 0xffffffff для unsigned int
while ((cout << "Enter sort limit: ") &&
(cin >> sort_limit) &&
(values.size() <= (sort_limit - 1)))
{
cout << "an unsigned integer value between 1 and " << values.size() << " expected\n";
}
// если удалось прочитать sort_limit и пройти цикл проверки диапазона
if (cin.good())
{
// делаем частичную сортировку
vector<int>::iterator middle(values.begin() + sort_limit);
partial_sort(values.begin(), middle, values.end());
// вывод результата
cout << sort_limit << "-th value is: " << *(middle - 1) << "\n";
// для отладки - можно закомментировать,
// а можно и посмотреть, как работает partial_sort
cout << "debug: ";
copy(values.begin(), values.end(), ostream_iterator<int,char>(cout," "));
cout << "\n";
}
else
{
// не ввели sort_limit
cout << "input aborted\n";
}
}
else
{
// пустой список или слово не end (например exit)
cout << "program aborted\n";
working = false;
}
values.clear();
}
else
{
// нет слова end в потоке - поток кончился.
cout << "unexpected end of input; program aborted\n";
working = false;
}
}
return 0;
}
//------------------------------------