Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <fstream>
- #include <exception>
- using namespace std;
- ifstream in("input.txt");
- ofstream out("output.txt");
- /*
- 5
- 281 Petrov Denis Valer 2000 5 5 5 5 5
- 281 Petrov Denis Valer 2001 5 5 5 5 5
- 281 Karpenko Oksana Sergeevna 2001 3 4 5 5 5
- 181 Merkulov Bogdan Olegovich 2000 5 1 2 4 5
- 424 Afroond Georg Elesev 1999 2 3 4 5 1
- */
- struct Student {
- private:
- int group;
- string firstName;
- string Surname;
- string secondName;
- int dateOfBirth;
- int mark[5];
- public:
- Student() {};
- void initStudent()
- {
- in >> group >> Surname >> firstName >> secondName >> dateOfBirth;
- for (int i = 0; i < 5; ++i)
- in >> mark[i];
- }
- void printToFile()
- {
- out << group << ' ' << Surname << ' ' << firstName << ' ' << secondName << ' ' << dateOfBirth << ' ';
- for (int i = 0; i < 5; ++i)
- out << mark[i] << ' ';
- out << '\n';
- }
- bool operator < (Student & a)
- {
- if (this->Surname < a.Surname || this->Surname == a.Surname && this->dateOfBirth < dateOfBirth)
- return true;
- return false;
- }
- bool operator > (Student & a)
- {
- if (this->Surname > a.Surname || this->Surname == a.Surname && this->dateOfBirth > dateOfBirth)
- return true;
- return false;
- }
- };
- void siftDown(Student *studentss, int root, int bottom)
- {
- int maxChild; // индекс максимального потомка
- int done = 0; // флаг того, что куча сформирована
- // Пока не дошли до последнего ряда
- while ((root * 2 <= bottom) && (!done))
- {
- if (root * 2 == bottom) // если мы в последнем ряду,
- maxChild = root * 2; // запоминаем левый потомок
- // иначе запоминаем больший потомок из двух
- else if (studentss[root * 2] > studentss[root * 2 + 1])
- maxChild = root * 2;
- else
- maxChild = root * 2 + 1;
- // если элемент вершины меньше максимального потомка
- if (studentss[root] < studentss[maxChild])
- {
- swap(studentss[root], studentss[maxChild]);
- root = maxChild;
- }
- else // иначе
- done = 1; // пирамида сформирована
- }
- }
- // Функция сортировки на куче
- void heapSort(Student *studentss, int array_size)
- {
- // Формируем нижний ряд пирамиды
- for (int i = (array_size / 2) - 1; i >= 0; i--)
- siftDown(studentss, i, array_size - 1);
- // Просеиваем через пирамиду остальные элементы
- for (int i = array_size - 1; i >= 1; i--)
- {
- swap(studentss[0], studentss[i]);
- siftDown(studentss, 0, i - 1);
- }
- }
- int main()
- {
- int n;
- in >> n;
- Student * a = new Student[n];
- for (int i = 0; i < n; i++)
- a[i].initStudent();
- heapSort(a, n); // вызов функции сортировки
- for (int i = 0; i < n; i++)
- a[i].printToFile();
- printf("\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement