Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


скажу честно, код не смотрел. Но подскажу идею, куда копать (С++). Используй частичную сортировку. Код приведён скорее для демонстрации различных фичей стандартной библиотеки, чем шаблона 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;
}
//------------------------------------
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:14, 19-12-2008 | #11