Russian Qt Forum

Программирование => С/C++ => Тема начата: vbi от Апрель 23, 2013, 21:14



Название: Задачка сортировки
Отправлено: vbi от Апрель 23, 2013, 21:14
Есть массив string типа:

1004-34
1003-11
1006-31
1005-78
1002-25

Как отсортировать этот массив по значению после дефиса?
То есть чтоб было:

1003-11
1002-25
1006-31
1004-34
1005-78




Название: Re: Задачка сортировки
Отправлено: VPS от Апрель 23, 2013, 21:28
А что, если использовать std::sort со своей функцией сравнения?


Название: Re: Задачка сортировки
Отправлено: vbi от Апрель 23, 2013, 21:56
std::sort то что надо, только какую написать функцию сравнения? Вроде должно быть просто, задачка олимпиадная.
Неужели только искать номер вхождения дефиса, обрезать после дефиса конвертировать в число и сравнивать?


Название: Re: Задачка сортировки
Отправлено: gil9red от Апрель 23, 2013, 22:49
Код:
int getValue(QString text)
{
    return text.remove(QRegExp("[0-9]*-")).toInt();
}

void qSort(QStringList *list, int minIndex, int maxIndex)
{
    int i = minIndex;
    int j = maxIndex;

    // x - опорный элемент посредине между low и high
    int x = getValue(list->at((minIndex + maxIndex) / 2));
    do
    {
        while(getValue(list->at(i)) < x)
            ++i;  // поиск элемента для переноса в старшую часть

        while(getValue(list->at(j)) > x)
            --j;  // поиск элемента для переноса в младшую часть

        if(i <= j)
        {
            // обмен элементов местами:
            list->swap(i, j);
            // переход к следующим элементам:
            i++;
            j--;
        }

    }while(i < j);

    if(minIndex < j)
        qSort(list, minIndex, j);

    if(i < maxIndex)
        qSort(list, i, maxIndex);
}

void qSort(QStringList *list)
{
    qSort(list, 0, list->count() - 1);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QStringList list;
    list << "1004-34"
         << "1003-11"
         << "1006-31"
         << "1005-78"
         << "1002-25";

    qDebug() << list;

    qSort(&list);

    qDebug() << list;

    return a.exec();
}


Запускается C:\Sort\untitled-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_______\release\untitled.exe...
("1004-34", "1003-11", "1006-31", "1005-78", "1002-25")
("1003-11", "1002-25", "1006-31", "1004-34", "1005-78")


Название: Re: Задачка сортировки
Отправлено: m_ax от Апрель 24, 2013, 00:18
Я бы так сделал:

Код
C++ (Qt)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
int toint(const std::string & x) {
   auto begin = x.find_first_of("-", 0);
   auto end = x.find_first_not_of("0123456789", ++begin);
   return std::stoi(x.substr(begin, end-begin));
}
 
 
int main()
{
   std::vector<std::string> stringlist = {
       "1004-34",
       "1003-11",
       "1006-31",
       "1005-78",
       "1002-25"
   };
 
   std::cout << "Before sorting:" << std::endl;
   for (auto & s : stringlist) { std:: cout << s << std::endl; }
 
 
   std::sort(stringlist.begin(), stringlist.end(),
             [](const std::string &s1, const std::string &s2) { return toint(s1) < toint(s2); });
 
   std::cout << "After sorting:" << std::endl;
   for (auto & s : stringlist) { std:: cout << s << std::endl; }
 
   return 0;
}
 
 


Название: Re: Задачка сортировки
Отправлено: gil9red от Апрель 24, 2013, 00:19
Блин, незаметил что тут без qt хотят решение :)

Тогда вот:
Код:
int getValue(string text)
{
    string temp;

    bool flag = false;

    for(int i = 0; i < text.size(); i++)
    {
        if(flag)
            temp.append(&text[i]);

        if(text[i] == '-')
            flag = true;
    }

    return atoi(temp.c_str());
}

void qSort(vector <string> *vect, int minIndex, int maxIndex)
{
    int i = minIndex;
    int j = maxIndex;

    // x - опорный элемент посредине между low и high
    int x = getValue(vect->at( (minIndex + maxIndex) / 2) );
    do
    {
        while(getValue(vect->at(i)) < x)
            ++i;  // поиск элемента для переноса в старшую часть

        while(getValue(vect->at(j)) > x)
            --j;  // поиск элемента для переноса в младшую часть

        if(i <= j)
        {
            // обмен элементов местами
            swap(vect->at(i), vect->at(j));

            // переход к следующим элементам:
            i++;
            j--;
        }

    }while(i < j);

    if(minIndex < j)
        qSort(vect, minIndex, j);

    if(i < maxIndex)
        qSort(vect, i, maxIndex);
}

void qSort(vector <string> *vect)
{
    qSort(vect, 0, vect->size() - 1);
}

int main(int argc, char *argv[])
{
    vector <string> stringVector;
    stringVector.push_back("1004-34");
    stringVector.push_back("1003-11");
    stringVector.push_back("1006-31");
    stringVector.push_back("1005-78");
    stringVector.push_back("1002-25");

    for(int i = 0; i < stringVector.size(); i++)
        cout << stringVector[i].c_str() << "\n";

    qSort(&stringVector);

    cout << "\n";

    for(int i = 0; i < stringVector.size(); i++)
        cout << stringVector[i].c_str() << "\n";

    return 0;
}


Запускается C:\Sort\untitled-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_______\release\untitled.exe...
1004-34
1003-11
1006-31
1005-78
1002-25

1003-11
1002-25
1006-31
1004-34
1005-78


Библиотеки с++ такие тяжелые для понимания, особенно после Qt... :)
Qtшный вариант сделал меньше чем за 10 минут
А на чистом с++ пока гуглил стандартные библиотеки и их классы, пока вспоминал, и делал потратил 1 час >:(


Название: Re: Задачка сортировки
Отправлено: m_ax от Апрель 24, 2013, 00:30

Библиотеки с++ такие тяжелые для понимания, особенно после Qt... :)
Qtшный вариант сделал меньше чем за 10 минут
А на чистом с++ пока гуглил стандартные библиотеки и их классы, пока вспоминал, и делал потратил 1 час >:(

Чёт всё равно, как то сложно получилось..


Название: Re: Задачка сортировки
Отправлено: gil9red от Апрель 24, 2013, 04:26

Библиотеки с++ такие тяжелые для понимания, особенно после Qt... :)
Qtшный вариант сделал меньше чем за 10 минут
А на чистом с++ пока гуглил стандартные библиотеки и их классы, пока вспоминал, и делал потратил 1 час >:(

Чёт всё равно, как то сложно получилось..

Давно на чистом с++ не писал :)


Название: Re: Задачка сортировки
Отправлено: m_ax от Апрель 24, 2013, 11:37

Библиотеки с++ такие тяжелые для понимания, особенно после Qt... :)
Qtшный вариант сделал меньше чем за 10 минут
А на чистом с++ пока гуглил стандартные библиотеки и их классы, пока вспоминал, и делал потратил 1 час >:(

Чёт всё равно, как то сложно получилось..

Давно на чистом с++ не писал :)

Т.е. когда вы пишите что-либо с использованием Qt, это уже получается не чистый c++?


Название: Re: Задачка сортировки
Отправлено: Bepec от Апрель 24, 2013, 12:03
Да как ни странно :) Qt это ж обёртка по сути. Так что по сути правильно говорить, что это не чистый С++. а нарядный С++ :D


Название: Re: Задачка сортировки
Отправлено: vbi от Апрель 24, 2013, 14:29
Пасиба всем! Вот и я на чистом давно не писал))


Название: Re: Задачка сортировки
Отправлено: vbi от Апрель 24, 2013, 22:37
gil9red, спасибо, работает.
m_ax, что такое "auto", впервые такое вижу? Не компилит его.


Название: Re: Задачка сортировки
Отправлено: alex312 от Апрель 24, 2013, 23:46
что такое "auto", впервые такое вижу? Не компилит его.
http://en.cppreference.com/w/cpp/language/auto


Название: Re: Задачка сортировки
Отправлено: Igors от Апрель 25, 2013, 06:22
Возможно здесь имелось ввиду совсем другое - ограниченный (и заранее известный) диапазон чисел после знака минус. Тогда можно обойтись без сортировки


Название: Re: Задачка сортировки
Отправлено: m_ax от Апрель 25, 2013, 09:50
gil9red, спасибо, работает.
m_ax, что такое "auto", впервые такое вижу? Не компилит его.

Тогда вообще странно, что вас только auto удивило..


Название: Re: Задачка сортировки
Отправлено: m_ax от Апрель 25, 2013, 09:52
Возможно здесь имелось ввиду совсем другое - ограниченный (и заранее известный) диапазон чисел после знака минус. Тогда можно обойтись без сортировки

Точно, Igors, имелось совсем, совсем другое..
ТС, просто не может грамотно поставить задачу( Ну ничего, у него ещё всё впереди)