Помощь - Поиск - Пользователи - Календарь
Полная версия: Разработка и алгоритм многомерной сортировки.
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Andrewshkovskii
Вот моя идея :
Есть какой-то массив объектов одного класса.
Прим. класса :
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 . но не особо понимаю.
volvo
Я не понял, чем тебя не устраивает, скажем, стандартный 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);
...
Andrewshkovskii
хм..не совсем понятно мне,как же быть тогда с массивом объектов?или std::sort() использовать в цикле?..
also, прощу прощения за глупый вопрос.и ещё,в примере ошибка?

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

PartialOne используется без параметров?..
volvo
Цитата
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];
}
}
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.