IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Разработка и алгоритм многомерной сортировки., язык : C++. Компилятор/IDE Eclipse+minGW+gcc.
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Вот моя идея :
Есть какой-то массив объектов одного класса.
Прим. класса :
class employee {
public:
int age; // Возраст
std::string employeeLname;//Фамилия
long int salary; // зарплата
//далее описание его методов и т.д.
//...
};

Массив фактически является таблицей штата сотрудников.Предположим,что нам надо отсортировать сначало по фамилии,далее по возрасту,потом,сохраняя порядок по фамилии и возрасту, по зарплате.НО,допустим,пользователь хочет отсортировать таблицу по Фамилии , зарплате и стажу(именно в таком порядке),или же, по зарплате и возрасту,но не по фамилии. Т.е Возможных вариантов будет
"полная сортировка"
1 1 1
сортировка по 2м параметрам
1 1 0
0 1 1
1 0 1
сортировка по 1му параметру
1 0 0
0 0 1
0 1 0
всего у нас (2^n )-1) возможных сортировок.
(где 1 и 0 - битовые флаги,означающие сортировку по какому-то выбранному параметру).

Вопрос в следующем,есть ли у кого-то примеры таких алгоритмов или же,какие-нибудь идеи по алгоритму?Я пока читаю вот это - http://sources.ru/magazine/0906/03.html . но не особо понимаю.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Я не понял, чем тебя не устраивает, скажем, стандартный std::sort с твоим предикатом сравнения? Просто пишешь функцию, как сравнивать 2 элемента таблицы между собой, и передаешь эту функцию в sort() третьим параметром. Все, больше ничего не надо...

Скажем, чтобы отсортировать
Цитата
по зарплате и возрасту,но не по фамилии
, достаточно:
bool PartialOne(const employee& first, const employee& second) {
if(first.salary == second.salary) {
return (first.age < second.age);
}
else return (first.salary < second.salary);
}
...
sort(vec.begin(), vec.end(), PartialOne);
...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


хм..не совсем понятно мне,как же быть тогда с массивом объектов?или std::sort() использовать в цикле?..
also, прощу прощения за глупый вопрос.и ещё,в примере ошибка?

 sort(vec.begin(), vec.end(), PartialOne);

PartialOne используется без параметров?..

Сообщение отредактировано: Andrewshkovskii -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
PartialOne используется без параметров?..
Параметры подставит сам std::sort()... Вот тебе иллюстрация, как это работает:

#include <iostream>
#include <vector>

using namespace std;

class employee {
friend ostream& operator << (ostream&, const employee&);
public:
int age; // Возраст
std::string employeeLname; //Фамилия
long int salary; // зарплата

// ...
};

bool FullSort(const employee& first, const employee& second) {
if(first.employeeLname == second.employeeLname) {
if(first.age == second.age) {
return (first.salary < second.salary);
}
else return (first.age < second.age);
}
else return (first.employeeLname < second.employeeLname);
}

bool PartialOne(const employee& first, const employee& second) {
if(first.salary == second.salary) {
return (first.age < second.age);
}
else return (first.salary < second.salary);
}

ostream& operator << (ostream& os, const employee& obj)
{
os << obj.employeeLname << "\t" << obj.age << "\t" << obj.salary << endl;
return os;
}


const int size = 9;
employee tbl[size] = {
{30, "ivanov", 1000},
{32, "ivanov", 1150},
{32, "ivanov", 1170},
{34, "petrov", 1200},
{29, "andreev", 1100},
{25, "andreev", 1130},
{24, "andreev", 1180},
{25, "alexeev", 985},
{27, "sidorov", 1100}
};

int main() {
vector<employee> vec; // массив объектов...
for(int i = 0; i < size; i++) {
vec.push_back(tbl[i]);
}

cout << "First sort:" << endl;
// Полная сортировка, по фамилии -> возрасту -> зарплате
sort(vec.begin(), vec.end(), FullSort);

for(int i = 0; i < size; i++) {
cout << vec[i];
}

cout << "Second sort:" << endl;
// сортировка по зарплате -> возрасту
sort(vec.begin(), vec.end(), PartialOne);

for(int i = 0; i < size; i++) {
cout << vec[i];
}
}
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 1.12.2020 18:21
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name